C++11 在具有受保护析构函数的类中使用unique_ptr

C++11 在具有受保护析构函数的类中使用unique_ptr,c++11,templates,stl,policy-based-design,C++11,Templates,Stl,Policy Based Design,我正在从学习基于策略的设计,我被困在下面的一个简单示例中,我试图在模板化策略类中使用std::unique_ptrs的std::vector: #包括 #包括 模板结构MyPolicy{ MyPolicy()=默认值; MyPolicy(std::size\u t N):myvec{std::vector(N)}{ 对于(std::size\u t i=0;i

我正在从学习基于策略的设计,我被困在下面的一个简单示例中,我试图在模板化策略类中使用
std::unique_ptr
s的
std::vector

#包括
#包括
模板结构MyPolicy{
MyPolicy()=默认值;
MyPolicy(std::size\u t N):myvec{std::vector(N)}{
对于(std::size\u t i=0;i
一切都在上面运行良好。然而,问题在于,既然
MyPolicy
应该继承自,它的析构函数需要是
虚拟的
公共的
,或者是非
虚拟的
受保护的
(至少引用自书中)

在上面的示例中,每当我取消注释这些行时

公共:
virtual~MyPolicy()=默认值;

受保护:
~MyPolicy()=默认值;
代码不编译。我无法理解本例中与
std::unique_ptr
相关的问题是什么,因为类型
T
不是不完整的,或者具有受保护/专用析构函数的内容


谢谢你的帮助。谢谢。

声明析构函数可防止隐式声明移动构造函数和移动赋值运算符。因此,如果声明虚拟析构函数并希望使用默认的特殊移动函数,则需要自己显式声明它们:

public:
  virtual ~MyPolicy() = default;
  MyPolicy(MyPolicy&&) = default;             //here
  MyPolicy& operator= (MyPolicy&&) = default; //and here

我正在检查上面的示例。即使没有定义移动函数,为什么您认为该示例仍然有效?可以相应地修改您的答案吗?@ArdaAytekin使用隐式定义的复制赋值运算符。哦,我明白了。非常感谢。因此,基本上,如果我显式地使用它们,我假设
unique_ptr
就是这种情况,那么编译器就找不到回退选项。即使我使用
std::move
,编译器也会退回到复制语义,那么?非常感谢您的及时回答。@ArdaAytekin是的,显式删除它们就像对编译器说您不希望类型是可移动的,如果您不删除它们,那么在这种情况下将使用复制版本。