为何右值引用参数的成员无法调用移动构造函数?
问题原因与解决方案
你代码的问题核心是:C++中有名称的右值引用变量本身属于左值,无法直接绑定到移动构造函数的右值引用形参。
你传入移动构造的temp确实是右值引用类型,用来接收外部传入的右值对象,但temp作为有明确变量名的实例,本身属于左值范畴。你直接访问temp.mVector得到的是左值的unique_ptr实例,编译器会优先匹配拷贝构造函数,而unique_ptr为了保证独享所有权,已经显式删除了拷贝构造函数,因此触发编译报错。
修复方案
你只需要用std::move把temp.mVector显式转为右值,就可以触发unique_ptr的移动构造,修改后的代码如下:
#include <memory> #include <utility> // std::move定义在该头文件 struct C { std::unique_ptr<int[]> mVector; size_t mSize; C() = default; C(C &&temp) : mVector(std::move(temp.mVector)) // 显式转右值触发移动构造 , mSize(temp.mSize) // 基础类型直接拷贝即可,无需移动 {} };
补充说明
std::move本身不执行任何资源移动操作,仅负责将输入的左值强转为右值引用类型,让编译器可以匹配到移动语义对应的函数重载- 对于
size_t这类基础数据类型,移动和拷贝的开销完全一致,不需要加std::move - 你也可以直接使用编译器默认生成的移动构造,代码更简洁且效果完全一致:
C(C &&) = default;
内容的提问来源于stack exchange,提问作者PCh
相关产品推荐
相关产品推荐

