[英]C++ Move constructor for object with std::vector and std::array members
[英]std::move on a C++ class does not move all members?
我了解使用v.push_back(std::move(foo))
會將foo內容移至向量。
但是我不明白為什么下面的代碼:
#include <iostream>
#include <vector>
struct Foo {
std::string s;
float f;
friend std::ostream& operator<<(std::ostream& stream,const Foo& foo) {
stream << "{" << foo.s << ":" << foo.f << "}";
return stream;
}
};
int main() {
Foo foo{"Hello",2.0f};
std::vector<Foo> v;
v.push_back(foo);
std::cout << foo << std::endl;
v.push_back(std::move(foo));
std::cout << foo << std::endl;
std::cout << v[0] << v[1] << std::endl;
}
產生此輸出:
{Hello:2}
{:2}
{Hello:2}{Hello:2}
為什么2不被“感動”?
您創建一個變量foo
Foo foo{"Hello",2.0f};
然后聲明一個向量
std::vector<Foo> v;
然后調用push_back
,它調用Foo
的副本
v.push_back(foo);
std::cout << foo << std::endl;
然后您std::move(foo)
,這會使您的foo
實例無效
v.push_back(std::move(foo));
試圖cout
foo
現在是不確定的行為,因為內部有 可能是垃圾。
std::cout << foo << std::endl;
從技術上講,您可以 std::move
原語,但是大多數實現將僅調用副本,因為它更便宜,更快捷 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.