簡體   English   中英

如果我使用 std::move,如何確保永遠不會調用復制構造函數

[英]How I can be ensure that copy constructor will never be called if I use std::move

請參閱下面的代碼。 我評論了移動構造函數,而不是編譯錯誤,現在調用了復制構造函數! 盡管我使用的是std::move

如果我使用std::move ,我如何確保我巨大的 object 永遠不會調用復制構造函數(例如,我忘記添加移動構造函數)?

class MyHugeObject
{
public:
    MyHugeObject()
    {
    }
    MyHugeObject(const MyHugeObject& m)
    {
        std::cout << "copy huge object\n";
    }
    // MyHugeObject(MyHugeObject&& m)
    // {
    //     std::cout << "move huge object\n";
    // }
};

MyHugeObject func()
{
    MyHugeObject m1;
    MyHugeObject&& m2 = std::move(m1);
    return std::move(m2);
}

int main()
{
    auto m = func();
    return 0;
}

Output:

copy huge object

如果您的類型的復制構造特別昂貴或有問題,但您不想完全禁止,您可以將復制構造函數標記為explicit 如果沒有明確請求,顯式復制構造函數將不允許復制(例如,您不能使用它自動按值傳遞 arguments),但仍可用於顯式復制構造。 同時,仍然可以允許隱式移動構造。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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