簡體   English   中英

調用復制構造函數而不是移動構造函數?

[英]Call copy constructor instead of move constructor?

我這樣定義一個 class A

class A {
public:
    A(){
        cout << "A constructing..." << endl;
    }
    A(const A &a){
        cout << "A copy constructing..." << endl;
    }
    A(A&& a){
        strcpy(name, a.name);
        cout << "A move constructing..." << endl;
    }
    ~A(){
        cout << "A destructing..." << name << endl;
    }
};

還有一個簡單的 function:

A f(A&& b) {
    cout << "------after call------" << endl;
    A f = b; // Use "A f(b)" to get the same effect
    cout << "------before return------" << endl;
    return f;
}

當我調用auto test = f(move(b)); ,為什么它會調用復制構造函數而不是移動構造函數? f()中的b不是右值嗎?

不, f主體中的表達式b是一個左值。 變量的名稱始終是左值,即使變量的聲明具有右值引用類型。

存在此規則是因為否則在您想要之前意外地從變量中移動有點太容易了:

void validate(A obj);

void f(A&& b) {
    A a1 = b;
    // Maybe some other code in between.
    A a2 = b;
}

即使某些A右值表達式被傳遞給f ,一旦在f中它有一個名稱,因此 object 可以多次使用。 如果我們兩次都復制而不是移動,至少這比移動然后嘗試使用 move-from 變量更安全。

因此,當您知道這是最后一次需要變量的值時,在右值引用變量名稱上使用std::move ,以明確告訴該上下文可以移動。

暫無
暫無

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

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