我已经构建了一个自定义类,并遵循(据我所知)这篇文章中描述的三规则:https://stackoverflow.com/a/51864979/2184449我有一个
MyClass::~MyClass
的自定义定义
、MyClass::operator=(MyClass mc)
和 MyClass::MyClass(MyClass &mc)
。
但是,当我构建
vector
实例的 MyClass
并尝试 emplace_back()
MyClass
实例时,我收到此错误:
在模板中:由于要求'__is_cpp17_move_insertablestd::allocator
::value',静态断言失败:指定的类型不满足Cpp17MoveInsertable的要求
怎样才能让我的班级满足
Cpp17MoveInsertable
的要求?
Cpp17MoveInsertable
要求该对象可以从右值引用构造,此类代码的简化示例是
MyClass obj1;
MyClass obj2{std::move(obj1)}; // this line needs to compile
// std::move is a cast to an rvalue reference
这会调用具有以下声明的构造函数,即移动构造函数
MyClass(MyClass&& other); // move constructor
或者,右值引用可以绑定到 const 左值引用,因此如果移动构造函数不可用,则可以调用复制构造函数
MyClass(const MyClass& other); // copy constructor
接受非常量左值引用的构造函数
MyClass(MyClass&)
无法使用右值引用调用,因此上面的代码将无法编译,事实上这样的构造函数甚至不适用于以下代码。
const MyClass obj1;
MyClass obj2{obj1}; // error requires non const lvalue reference
复制和移动构造函数以及赋值运算符的声明语法应与以下内容相同。
MyClass(const MyClass&); // copy construct
MyClass& operator=(const MyClass&); // copy assign
MyClass(MyClass&&); // move construct
MyClass& operator=(MyClass&&); // move assign
另外,99% 的情况下,您应该尝试执行零规则,即不定义任何析构函数或复制/移动操作,或者在虚拟析构函数的情况下不定义任何析构函数或复制/移动操作。