【发布时间】:2017-11-11 06:55:12
【问题描述】:
#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 移动到 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;
}
上述程序的输出产生以下结果
搬家前 t1.n=5 搬家后 t1.n=5 t2.n=5
将对象 t1 移动到 t2 后,我预计 t2.n 的值为 0,但旧值仍然存在。
谁能解释一下这种行为背后的概念。
【问题讨论】:
-
与
std::string不同,int没有将其设置为空值的默认构造函数。这能回答你的问题吗? -
@MrLister 具有默认构造函数在此处无效。从右值初始化基本类型(即移动)根本不会修改源对象。
标签: c++ c++11 constructor move semantics