簡體   English   中英

顯式刪除了移動構造函數

[英]Explicitly deleted move constructor

為什么這個:

struct A
{
    A(int) {
        cout << "construct from int" << endl;
    }

    A(A&&) = delete;

    A(const A &) {
        cout << "copy constructor" << endl;
    }
};

int main(){
    A a = 0;
}

給我一個錯誤:

error: use of deleted function ‘A::A(A&&)’

為什么當我添加這樣的移動構造函數

A(A&&) {
    cout << "move constructor" << endl;
}

編譯很好,但程序的輸出只是

construct from int

所以據我所知,編譯器要求構造函數但不使用它。 為什么? 這對我來說毫無意義。

PS我認為

A a = 0;

是等價的

A a = A(0);

但為什么既不移動構造函數也不移動賦值運算符?

根據C ++標准(12.8復制和移動類對象)

31當滿足某些條件時,允許實現省略類對象的復制/移動構造,即使為復制/移動操作選擇的構造函數和/或對象的析構函數具有副作用。 在這種情況下,實現將省略的復制/移動操作的源和目標視為僅僅兩種不同的引用同一對象的方式,並且該對象的銷毀發生在兩個對象的后期時間。在沒有優化的情況下銷毀。這種復制/移動操作的省略,稱為復制省略,在以下情況下允許(可以組合以消除多個副本):.... - 當一個未綁定的臨時類對象時將引用(12.2)復制/移動到具有相同cv非限定類型的類對象, 可以通過將臨時對象直接構造到省略的復制/移動的目標中來省略復制/移動操作

30如果對象的復制/移動構造函數或復制/移動賦值運算符被隱式使用並且無法訪問特殊成員函數,則程序格式不正確(第11條)。 [注意:使用復制/移動構造函數或復制/移動賦值運算符將一個對象復制/移動到另一個對象不會更改任一對象的布局或大小。 - 尾注]

暫無
暫無

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

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