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

为何未用std::move时仍调用移动构造函数而非拷贝构造?

移动构造函数调用时机解惑

核心逻辑:移动构造函数的参数是右值引用(MemoryBlock&&),只有传入右值时才会触发;左值会优先触发拷贝构造,除非显式转成右值。

  • 关于v.push_back(m)调用拷贝构造:
    m是一个左值——它是具名变量,有确定的内存地址,程序后续可能还会访问它的状态。C++不会自动把左值当成右值处理,因此push_back会匹配接受左值的重载,调用拷贝构造函数,确保原对象m的资源不受影响。

  • 关于v.push_back(MemoryBlock(25))调用移动构造:
    MemoryBlock(25)是一个临时对象,属于右值——它没有名字,创建后立即等待销毁,程序后续不会再使用它。C++标准规定,这种临时右值可以直接绑定到右值引用,因此push_back会匹配接受右值的重载,调用移动构造函数,直接转移临时对象的资源到容器内的新对象,避免不必要的拷贝开销。

如果想让v.push_back(m)也触发移动构造,只需用std::move(m)把左值m强制转换为右值引用,写法是v.push_back(std::move(m))。但要注意,调用后m的资源已被转移,其状态变为“有效但未定义”,不能再依赖它的原有资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:37:12