为何未用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
相关产品推荐
相关产品推荐

