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是的,显式删除它们就像对编译器说您不希望类型是可移动的,如果您不删除它们,那么在这种情况下将使用复制版本。