禁止复制操作是否自动禁止移动操作? 我想写一个C++类,没有任何拷贝和移动语义:我只关心它的构造函数和析构函数。< /P>
我使用C++11的禁止复制操作是否自动禁止移动操作? 我想写一个C++类,没有任何拷贝和移动语义:我只关心它的构造函数和析构函数。< /P>,c++,c++11,move-semantics,C++,C++11,Move Semantics,我使用C++11的=delete语法显式禁用了复制操作(即复制构造函数和复制赋值运算符),例如: class MyClass { public: MyClass() { /* Init something */ } ~MyClass() { /* Cleanup something */ } // Disable copy MyClass(const MyClass&) = delete; MyClass& oper
=delete
语法显式禁用了复制操作(即复制构造函数和复制赋值运算符),例如:
class MyClass
{
public:
MyClass() { /* Init something */ }
~MyClass() { /* Cleanup something */ }
// Disable copy
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
};
作为一个测试,我尝试在类实例调用<代码> STD::MOVER()/CUT>,并且似乎没有自动生成的操作,因为VisualStudio 2015 C++编译器发出错误消息。
这是一个针对MSVC 2015的行为,还是由C++标准规定的,通过禁用代码>删除/>代码>复制操作自动禁用移动构造函数和移动赋值?C++14中的[class.copy]/9读取:
如果类X
的定义没有显式声明移动构造函数,则将隐式声明一个移动构造函数
默认为当且仅当
没有用户声明的复制构造函数X
没有用户声明的复制分配运算符X
没有用户声明的移动分配运算符,并且X
没有用户声明的析构函数X
不过,您仍然可以自己显式定义移动构造函数和/或移动分配。因此,防止复制实际上并不会阻止移动构造和移动赋值——它只是阻止编译器隐式实现它们。请参阅:因此,我的“用户声明的析构函数”的存在会阻止移动构造函数的自动(隐式)声明。我想知道拥有一个
=delete
复制构造函数是否算作“用户声明的复制构造函数”。@Mr.C64确实如此。如果需要移动构造函数,可以显式默认它。或者,你可以尝试遵守零的规则。