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

为何右值引用参数的成员无法调用移动构造函数?

问题原因与解决方案

你代码的问题核心是: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:36:05