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