You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复‘指定类型不满足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()操作时,会尝试移动元素以提升效率,但你的类存在两个核心问题:

  1. 拷贝构造函数的参数是MyClass &mc(非const),无法从右值临时对象完成拷贝,而移动操作的基础就是对右值的处理
  2. 自定义拷贝构造、拷贝赋值和析构函数后,编译器不会自动生成移动构造和移动赋值运算符,导致类完全不支持移动操作

要满足Cpp17MoveInsertable要求,需做以下调整:

  • 将拷贝构造函数的参数改为const左值引用:MyClass::MyClass(const MyClass &mc)
  • 补充移动构造和移动赋值逻辑:
    • 如果类没有手动管理原始指针这类资源,直接用= default让编译器生成默认移动操作即可:
      MyClass::MyClass(MyClass &&) = default;
      MyClass& MyClass::operator=(MyClass &&) = default;
      
    • 如果需要手动管理资源,就自行实现移动构造和移动赋值函数,确保完成资源所有权的转移而非拷贝

修改后,你的类就能支持移动操作,满足Cpp17MoveInsertable要求,vector::emplace_back()也能正常运行。

内容的提问来源于stack exchange,提问作者Jere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:22:31