什麼時候私有建構子不是私有建構子?
在 C 中,將建構子設為私有似乎是防止物件建立的直接方法課外。但是,當預設建構函數宣告為私有時,會出現意外行為。
考慮以下程式碼:
class C { C() = default; }; int main() { C c; // Error: Private constructor auto c2 = C(); // Error: Private constructor }
令人驚訝的是,由於私有預設建構函數,此程式碼無法編譯。然而,以下程式碼:
class C { C() = default; }; int main() { C c{}; // Compiles auto c2 = C{}; // Compiles }
編譯成功。
這種奇怪行為的原因在於 C 標準。根據 8.4.2/5 [dcl.fct.def.default],如果函數在其第一個聲明中明確默認,則函數不是用戶提供的。因此,在我們最初的範例中,預設建構函數不是使用者提供的。
缺乏使用者提供的建構子使得類別C 成為依照8.5.1/1 [dcl.init.aggr] 的聚合,其中:
對於聚合,花括號初始化語法被視為構造函數呼叫而不是聲明,這就是為什麼它在後一個程式碼片段中成功的原因。
以上是為什麼私有預設建構函式會阻止 C 中的物件創建,但支撐初始化卻可以運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!