次のテストは 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
vectorv
にコピーされるため、afterx
はまだあります。checkpoint1以降はなくなってしまいましたが(ローカルのみ)、ベクトルはそのままコピーされているので大丈夫です!!"xxxxx"
push_back
x
v
x
v.push_back(x)
については、 が使用されているためstring y
ベクトルに移動されているため、 ではなくが表示されていることがわかります。これは正しい動作です。v
std::move
cout << "y=" << y
"y="
"y=yyyyy"
私が得られないのは、checkpoint2 の後y
、ローカル var の寿命が尽きたため、文字列の所有者v
としての vector です ( は vectorによってvector に移動されるため、無効な要素を含む必要があります。スタック ローカル var として、チェックポイント2で寿命!y
y
v
push_back(std::move(y))
y
checkpoint2 の後、 vectorv
がまだ持っている が"yyyyy"
vectorにy
移動された後、 vectorがポインタだけを持っているv
場合、スコープがなくなった後、スタックメモリ内のローカル var であるため、スタックがなくなったため、 vectorは役に立たないので、このように見えることに混乱しています違います!v
vptr = &y
y
vptr
したがって、ベクトルには独自のメモリがあり、独自に保持する必要がありますが、これが当てはまる"yyyyy"
場合は と同じです。push_back(x)
std::move(y)
私は何かが恋しいですか?