std::move 上一个C++ class 不移动所有成员?
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 不是 "moved"?
你创建了一个变量foo
Foo foo{"Hello",2.0f};
然后声明一个向量
std::vector<Foo> v;
然后调用 push_back
调用 copy 你的 Foo
v.push_back(foo);
std::cout << foo << std::endl;
然后你 std::move(foo)
,这 使你的 foo
实例无效 [=41=]
v.push_back(std::move(foo));
尝试 cout
foo
现在是未定义的行为,因为内部结构 是 可能是 垃圾。
std::cout << foo << std::endl;
虽然你在技术上 可以 std::move
一个原始人,most implementations will simply invoke a copy because it is cheaper and faster.
我知道使用 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 不是 "moved"?
你创建了一个变量foo
Foo foo{"Hello",2.0f};
然后声明一个向量
std::vector<Foo> v;
然后调用 push_back
调用 copy 你的 Foo
v.push_back(foo);
std::cout << foo << std::endl;
然后你 std::move(foo)
,这 使你的 foo
实例无效 [=41=]
v.push_back(std::move(foo));
尝试 cout
foo
现在是未定义的行为,因为内部结构 是 可能是 垃圾。
std::cout << foo << std::endl;
虽然你在技术上 可以 std::move
一个原始人,most implementations will simply invoke a copy because it is cheaper and faster.