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

为什么使用std::move返回含std::unique_ptr成员的类时编译报错?

问题原因说明
  • 报错的触发点不是return阶段的移动逻辑,而是A(m)这一步构造类A对象时就已经失败:
    类A的构造函数参数是按值传递的std::unique_ptr<int>,你构造A时传入的m是局部左值对象,按值传参需要调用std::unique_ptr的拷贝构造函数完成参数复制,但std::unique_ptr是独占所有权的智能指针,拷贝构造函数被显式删除,因此直接编译报错,根本不会执行到后续return的移动逻辑。
  • 你对return阶段移动语义的理解本身没有问题,只要类A对象能成功构造,返回时会自动调用移动构造函数处理std::unique_ptr成员,不需要额外套std::move。

修正方案

构造类A对象时,先把左值m转为右值即可:

#include <memory>

class A {
  public:
    explicit A(std::unique_ptr<int> m): m_(std::move(m)) {}
  private:
    std::unique_ptr<int> m_;
};

A makit(int num) {
    auto m = std::make_unique<int>(num);
    return A(std::move(m)); 
}

int main() {
    auto a = makit(42);
    return 0;
}

额外说明

你原代码中return std::move(A(m));的std::move是多余操作:A(m)本身就是纯右值临时对象,返回时自动适配移动语义,额外加std::move反而会阻碍编译器的返回值优化(RVO),降低执行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:01