如何修复`指定的类型不符合Cpp17MoveInsertable的要求`?

问题描述 投票:0回答:1

我已经构建了一个自定义类,并遵循(据我所知)这篇文章中描述的三规则: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
的要求?

c++ c++17
1个回答
0
投票

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% 的情况下,您应该尝试执行零规则,即不定义任何析构函数或复制/移动操作,或者在虚拟析构函数的情况下不定义任何析构函数或复制/移动操作。

    

© www.soinside.com 2019 - 2024. All rights reserved.