Bal*_*n K 4 c++ constructor move c++11 semantics
#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;
}
Run Code Online (Sandbox Code Playgroud)
上述程序的输出产生以下结果
移动前 t1.n=测试 移动后 t1.n= t2.n=测试
了解到,将对象 t1 移动到 t2 后,t2.n 的值结果为空字符串
但相同的概念移动概念不适用于整数。
#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;
}
Run Code Online (Sandbox Code Playgroud)
上述程序的输出产生以下结果
移动前 t1.n=5 移动后 t1.n=5 t2.n=5
将对象 t1 移动到 t2 后,我预计 t2.n 的值为 0,但旧值仍然存在。
有人可以解释一下这种行为背后的概念吗?
一般来说,移出对象可以具有对其类型有效的任何值。例如,移出的对象std::string可能会变成空的,或者可能是完全不同的东西。它有时可能是空的,有时不是。对其可以是什么没有任何限制,并且不应依赖确切的值。
由于移出的对象可以处于任何有效状态,因此我们可以看到复制对象是移动对象的有效方法。事实上,对于任何没有定义移动构造函数的类型,在移动对象时都会使用复制构造函数。std::move不要求移出的对象变空(我们不一定能为所有类型定义这个概念)。当然,复制可能不是移动对象的最有效方法,但这是允许的。基本类型基本上利用了这一点,因此移动基本类型相当于复制它。
我想再次强调这一点:(通常)不要依赖移出对象的值。它通常不是一个指定值。不要假设移出的对象与默认构造的对象相同。不要假设它是任何其他值。某些特定类型(例如int标准智能指针类型)可能会指定移出值,但这些是特殊情况,并不定义一般规则。通常明智的做法是,在将已知值复制到移出对象中之前不要使用该对象。