以下测试在 g++ 4.8.1 中编译
int main()
{
vector<string> v ;
v.push_back("33333") ;
v.push_back("44444") ;
v.push_back("55555") ;
{
string x("xxxxx") ;
v.push_back(x) ; //copy
cout << "x=" << x << endl ; //x=xxxxx
} //checkpoint1
{
string y("yyyyy") ;
v.push_back(std::move(y)) ; //move
cout << "y=" << y << endl ; //y=
} //checkpoint2
for(auto const i : v)
cout << i << " " ;
cout << endl ; //33333 44444 55555 xxxxx yyyyy
}
这是一个非常简单的来源,我的测试重点是std::move
. 如您所见,string x
是本地 var,而 executev.push_back(x)
被x
复制到 vector v
,所以x
仍然有"xxxxx"
after push_back
。在 checkpoint1 之后,x
它就消失了(它只是本地的)但是向量v
有它的值,因为x
在做的时候被复制了v.push_back(x)
,所以没关系!
至于string y
,它被移动到向量v
,因为std::move
被使用,所以你可以看到cout << "y=" << y
显示"y="
,而不是"y=yyyyy"
,这是正确的行为。
我没有得到的是,在 checkpoint2 之后,字符串y
作为本地 var 已经结束,所以 vectorv
作为y
所有者(因为y
被移动到 vector v
,push_back(std::move(y))
应该包含一个无效元素y
,因为作为堆栈本地 var,生命在 checkpoint2 结束!
我很困惑,在checkpoint2之后,vectorv
仍然有"yyyyy"
,y
被移动到vector v
,如果vectorv
只有一个指针vptr = &y
,因为y
它是堆栈内存中的本地var,在它的范围之外,堆栈消失了,所以vectorvptr
没用,看起来像这样不对!
所以它一定是vector有自己的记忆保存"yyyyy"
在自己的,但如果是这样的话,它是一样的push_back(x)
,那为什么还要麻烦std::move(y)
呢?
我错过了什么吗?