2014-04-30 49 views
3

在書中「C++併發在行動」附錄A.3,引入違約功能時,它說:即使使用用戶定義的構造函數,編譯器何時仍會生成默認構造函數?

正常情況下,如果你手動編寫任何其他構造函數,編譯器將不再產生你的默認構造函數,所以如果你想要一個你必須寫它,這意味着你失去了這個奇怪的初始化屬性。但是,通過顯式聲明構造函數爲默認值,您可以強制編譯器爲您生成默認構造函數,並保留此屬性。

這是否意味着仍然有某些情況下(除了加入=default明確),編譯器仍然會產生即便是用戶定義的構造函數的默認構造函數?如果是的話,這些情況是什麼?或者只是我在這裏用言語挑剔。

+0

不,它只是意味着它說什麼,即'= default'意味着這意味着什麼。 –

回答

4

這是通過C++ 11 12.1/5回答:

如果沒有用於X類沒有用戶聲明的構造,不具有參數的構造被隱式地聲明爲缺省值。

因此,只要您聲明任何其他構造函數(即使默認或刪除),也沒有隱式聲明的默認構造函數。

例子:

#include <type_traits> 

struct A { }; 

struct B { B(B &&) = delete; }; 

static_assert(std::is_default_constructible<A>::value, "A"); 
static_assert(!std::is_default_constructible<B>::value, "B"); 
相關問題