[英]C++ auto with member initializer syntax and deleted copy constructor
class A
{
int a;
public:
A(const A&) = delete;
A& operator=(const A&) = delete;
A() : a {0}
{ }
};
int main()
{
auto a = A {};
}
上面的代碼沒有編譯,我得到以下錯誤:C2280'A :: A(const A&)':嘗試引用已刪除的函數
我正在使用visual studio 2015編譯器。 我的理解是使用成員初始化語法編譯器應該直接使用默認構造函數,這是在沒有auto時發生的情況,而在main中我使用A a{}
。 所以我想知道在這種情況下與auto的交易是什么。
auto a = A {};
僅當A
是可復制的構造或移動構造時才有效。 您使用auto
的事實無關緊要。 同樣的情況也是如此
A a = A {};
同樣。
聲明一個復制構造函數 - 甚至是delete
一個 - 禁止隱式聲明一個移動構造函數,因此你的類型A
既不是可復制的,也不是可構造的。 如果添加該行
A(A&&) = default;
到了A
的主體,代碼應該再次編譯。
實際上,在這種情況下,編譯器實際上不會調用任何副本或移動構造函數,只需在a
構造對象。 但是語言規則要求它仍然必須拒絕有意義的代碼,因為一段代碼是否被允許不應該依賴於可選的編譯器優化。
你的理解是正確的,所以讓我們一步一步看看這里發生了什么。
A {};
正如你所說,成員初始化語法,完全是猶太潔食。
auto a = (expression of some kind)
然后你正在構建auto a
。 執行類型推斷后,這相當於......
A a = (expression of some kind)
這看起來像一個復制構造函數。 你刪除了哪個。
你應該這樣使用auto:
auto a = new A();
如果您不想使用auto,這是c ++ 11方式:
A a{};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.