Cri*_*iss 1 c++ inheritance move-semantics c++11
我有一个名为explicitely删除的复制构造函数的类,比方说,NonCopyable
.然后是一个类型Base1
成员的类NonCopyable
.而另一类Base2
与Base1
父.最后 - Derivative
父母是一个阶级Base2
.
由于NonCopyable
是不可复制的,因此很明显Base1
,Base2
并且Derivative
也是不可复制的.但似乎还有移动构造函数(和赋值运算符)已删除.
在这里测试一下:
以下行给出了这些错误:
Derived d1, d2 = std::move(d1);
GCC: 'Derived :: Derived(Derived &&)'被隐式删除,因为默认定义是不正确的:class Derived:
其余的错误只是声称Base1
和Base2
复制ctors被隐式删除,这并不奇怪MSVC:错误C2280:'Derived :: Derived(const Derived&)':尝试引用已删除的函数
在提供的链接中,还有注释行,它们给出了类似的错误.请取消注释以查看我想向您展示的更多错误(例如,未remove_if
注释它会抱怨删除移动(在GCC上) /复制(在MSVC上)分配操作员).
我想要实现的是使Derivative(及其基础)可移动,但不可复制.
我正在使用Visual Studio 2015并获得与我提供的msvc链接完全相同的错误,但我不确定在rextester.com上使用什么版本的MSVC进行编译.
我也是应@Richard Critten的要求粘贴代码的:
class NonCopyable
{
public:
NonCopyable() { }
NonCopyable(const NonCopyable &) = delete;
NonCopyable & operator=(const NonCopyable &) = delete;
NonCopyable(NonCopyable &&) { }
NonCopyable & operator=(NonCopyable &&) { return *this; }
};
class Base1
{
public:
virtual ~Base1() = default;
private:
NonCopyable m;
};
class Base2 :
public Base1
{
public:
virtual ~Base2() = default;
};
class Derived :
public Base2
{
};
int main()
{
std::vector<Derived> v;
//std::remove_if(v.begin(), v.end(), [](const Derived &) { return true; });
//v.emplace_back();
Derived d1, d2 = std::move(d1);
}
Run Code Online (Sandbox Code Playgroud)
[class.copy]/9如果类的定义
X
没有显式声明一个移动构造函数,当且仅当一个类的定义被隐式声明为默认值时(9.4) -
X
没有用户声明的析构函数.
Base1
有一个用户声明的析构函数,所以没有移动构造函数.由于不可复制的成员,复制构造函数被隐式声明为已删除.所以Base1
既不能复制或移动,当然Base2
和Derived
它在一起.