如何修复‘指定类型不满足Cpp17MoveInsertable要求’错误?
问题描述
我自定义了MyClass类,自认为遵循了三法则,自定义了MyClass::~MyClass、MyClass::operator=(MyClass mc)和MyClass::MyClass(MyClass &mc)。但在构建MyClass实例的vector并调用emplace_back()时,出现以下错误:
In template: static assertion failed due to requirement '__is_cpp17_move_insertablestd::allocator<MyClass, void>::value': The specified type does not meet the requirements of Cpp17MoveInsertable
请问如何让我的类满足Cpp17MoveInsertable的要求?
解决方法
问题出在你的拷贝构造函数参数是非const左值引用,同时未定义移动构造函数和移动赋值运算符。
当vector执行扩容或emplace_back()操作时,会尝试移动元素以提升效率,但你的类存在两个核心问题:
- 拷贝构造函数的参数是
MyClass &mc(非const),无法从右值临时对象完成拷贝,而移动操作的基础就是对右值的处理 - 自定义拷贝构造、拷贝赋值和析构函数后,编译器不会自动生成移动构造和移动赋值运算符,导致类完全不支持移动操作
要满足Cpp17MoveInsertable要求,需做以下调整:
- 将拷贝构造函数的参数改为const左值引用:
MyClass::MyClass(const MyClass &mc) - 补充移动构造和移动赋值逻辑:
- 如果类没有手动管理原始指针这类资源,直接用
= default让编译器生成默认移动操作即可:MyClass::MyClass(MyClass &&) = default; MyClass& MyClass::operator=(MyClass &&) = default; - 如果需要手动管理资源,就自行实现移动构造和移动赋值函数,确保完成资源所有权的转移而非拷贝
- 如果类没有手动管理原始指针这类资源,直接用
修改后,你的类就能支持移动操作,满足Cpp17MoveInsertable要求,vector::emplace_back()也能正常运行。
内容的提问来源于stack exchange,提问作者Jere
相关产品推荐
相关产品推荐

