gpt4 book ai didi

C++ move 具有整数成员的对象的语义

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:38 25 4
gpt4 key购买 nike

#include<iostream>
#include<stdio.h>

using namespace std;
class Test
{
public:
string n;
Test():n("test") {}
};

int main()
{
Test t1;
std::cout<<"before move"<<"\n";
std::cout<<"t1.n=" << t1.n<<"\n";
Test t2=std::move(t1);

std::cout<<"after move"<<"\n";
std::cout<<"t1.n="<<t1.n<<"\n";
std::cout<<"t2.n="<<t2.n<<"\n";

return 0;
}

以上程序的输出结果如下

搬家前t1.n=测试搬家后t1.n=t2.n=测试

了解到,将对象 t1 move 到 t2 后,t2.n 的值结果为空字符串

但是相同的概念 move 概念不适用于整数。

#include<iostream>
#include<stdio.h>

using namespace std;

class Test
{

public:
int n;
Test():n(5) {}

};

int main()
{
Test t1;
std::cout<<"before move"<<"\n";
std::cout<<"t1.n=" << t1.n<<"\n";
Test t2=std::move(t1);

std::cout<<"after move"<<"\n";
std::cout<<"t1.n="<<t1.n<<"\n";
std::cout<<"t2.n="<<t2.n<<"\n";

return 0;
}

以上程序的输出结果如下

搬家前t1.n=5搬家后t1.n=5t2.n=5

将对象 t1 move 到 t2 后,我预计 t2.n 的值为 0,但旧值仍然存在。

谁能解释一下这种行为背后的概念。

最佳答案

一般来说,一个移出的对象可以有任何对其类型有效的值。例如,一个移出的 std::string 可能会变成空的,或者它可能是完全不同的东西。它有时可能是空的,有时不是。它可以是什么没有限制,不应依赖确切的值。

由于移出对象可以处于任何有效状态,我们可以看到复制对象是 move 对象的有效方式。事实上,对于任何没有定义 move 构造函数的类型, move 对象时都会使用复制构造函数。 std::move 不要求移出的对象变为空(我们不一定为所有类型定义一个概念)。当然,复制可能不是 move 对象的最有效方式,但它是允许的。原始类型基本上利用了这一点,因此 move 原始类型等同于复制它。

我想再次强调这一点:不要(通常)依赖于移出对象的值。它通常不是指定值。 不要假定移出的对象与默认构造的对象相同。 不要假设它是任何其他值。某些特定类型(例如 int)或标准智能指针类型可能会指定移出值,但这些都是特殊情况,并未定义一般规则。通常明智的做法是在将已知值复制到其中之前不要使用移出的对象。

关于C++ move 具有整数成员的对象的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44454687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com