簡體   English   中英

C ++ auto with member initializer syntax and deleted copy constructor

[英]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構造對象。 但是語言規則要求它仍然必須拒絕有意義的代碼,因為一段代碼是否被允許不應該依賴於可選的編譯器優化。

這種行為(很可能) 在C ++ 17中發生變化

你的理解是正確的,所以讓我們一步一步看看這里發生了什么。

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.

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