簡體   English   中英

std :: move不能移動所有成員嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM