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

C++删除移动构造的类对象为何无法作为函数返回值返回?

核心原因
  • 首先明确C++11及以后标准中函数返回局部对象的重载决议规则:当返回的是和函数返回值类型完全一致的局部自动存储期对象时,编译器会优先将该对象视为右值进行构造函数的匹配。
  • 显式删除(=delete)的函数仍然会参与重载决议,只有当匹配到该函数时才会抛出编译错误,不会自动降级匹配其他更低优先级的重载。

你的代码中显式声明了移动构造函数并标记为删除,重载决议时右值会优先匹配移动构造函数,匹配成功后发现该函数已被删除,直接触发编译错误,不会再去尝试匹配拷贝构造函数。

补充说明
  • 如果你删除显式声明Pos(Pos&& p) noexcept = delete;这行代码,因为你已经自定义了拷贝构造函数,编译器不会自动生成默认移动构造函数,此时重载决议找不到可用的移动构造,就会降级匹配拷贝构造函数,代码可以正常编译。
  • 即便编译器开启了返回值优化(NRVO)会省略实际的拷贝/移动操作,C++标准也要求必须先确认对应的构造函数是可访问且可用的,因此只要重载决议阶段选到了已删除的移动构造,无论是否开启优化都会编译失败。
可行的修改方案

如果你必须保留显式删除的移动构造,又需要返回局部对象,可以在return时手动将对象转为const左值引用,强制匹配拷贝构造:

Pos getPos()
{
    Pos p;
    return static_cast<const Pos&>(p); // 强制匹配拷贝构造
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:45:03