2013-07-20 51 views
3

我一直在閱讀本頁面以瞭解值初始化的概念 http://en.cppreference.com/w/cpp/language/value_initialization用戶定義的構造和隱含的默認構造函數

值初始化的效果是:

  • 如果T是一個類類型,至少有一個用戶提供的任何類型的構造函數,默認構造函數被調用。

但這似乎是在與其他來源的說明,如果存在至少一個用戶定義的構造函數,則編譯器不會生成隱式默認的構造直接矛盾(表達式像「T噸;」將不會編譯)。歡迎任何解釋。

回答

3

在此上下文中的「默認構造函數」表示一個構造函數,它不接受任何參數(或者因爲它沒有參數或者因爲它只有可選參數)。

「隱式構造函數」表示自動爲您生成的構造函數。這可以是一個無參數構造函數,一個拷貝構造函數或者(從C++ 11開始)移動構造函數。

所以,沒有矛盾。當T是具有用戶提供的構造函數的類類型時,則值初始化將調用默認的構造函數。如果這不存在(因爲您定義了另一個構造函數但沒有無參數構造函數),或者它不可訪問(因爲您將它標記爲私有或受保護,然後在不能使用此類函數的地方使用它),則值初始化格式不正確,編譯器會拒絕你的代碼。如果它被聲明但從未定義過,那麼程序將不會鏈接。

由於C++ 11的「默認」一詞大概是有些模棱兩可的,因爲它可以定義一個拷貝構造函數= default;

+0

而且,如果事情被調用,並且不存在程序不編譯。它仍然*被稱爲*,只是一個錯誤,因爲它缺少。 – Yakk

相關問題