c++ 为什么隐式移动构造函数在将数据移动到obj2后不使obj1为空或不确定状态?[duplicate]

mwkjh3gx  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(101)
    • 此问题在此处已有答案**:

Why std::move() is not stealing an int value?(2个答案)
can I use std::move with class that doesn't provide a move constructor?(5个答案)
Do built-in types have move semantics?(1个答案)
std::move Bug Spotted in C++ Primer 5th Edition(2个答案)
5天前关闭。
如下例所示,我希望编译器添加一个隐式移动构造函数,将obj1中的数据移动到obj2中,并使obj1为空或具有一些不确定状态。

#include <iostream>
#include <memory>
#include <mutex>
using namespace std;

class Demo
{
public:
    int val = 3;
};

int main()
{
    Demo obj1;
    cout << "before move obj1.val :" << obj1.val << std::endl;
    Demo obj2(std::move(obj1));
    //Expecting obj1.val moves into obj2.val and becomes zero etc.
    cout << "after move obj1.val :" << obj1.val << std::endl; 
    cout << "after move obj2.val :" << obj2.val << std::endl;
    return 0;
}

//输出:

before move obj1.val :3
after move obj1.val :3
after move obj2.val :3
bvjveswy

bvjveswy1#

这是一个关于移动语义在C中的含义的常见误解。
这并不意味着"在极端酷刑、痛苦和折磨的惩罚下,你必须从被移走的物体上拿走一切,并把它放进被移走的物体中,一旦移动操作完成,除了一大片荒地和燃烧的残骸外,你什么也不能留下"。
它真正的意思是"以最有效的方式使moved-to对象与moved-from对象完全相同,将moved-from对象的状态转移到moved-to对象,并且允许你尽可能多地弄乱moved-from对象的内容,只要转移尽可能有效"。这就是C
中move的意思(1)。
在move操作结束时,保持moved-from对象的状态不变是一个完全有效的结果,在使用短字符串优化的C实现中移动小的std::string时,经常会观察到这种情况。
对于自然整数和数值类型,这是你唯一可能期望的结果,不需要额外的步骤来将moved-from字节设置为随机数生成器的内容,或者其他什么,这是最少的工作量:没有。
(1)形式上,C
标准将其定义为移动对C库类型的影响,实际上,该定义也被所有其他C库采用。

相关问题