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.