C++ Primer第5版P450-451:編譯器合成的默認構造函數在某些情況下會被隱式定義為delete,導致類無法默認構造。
// 情況1:const內置類型成員無類內初始值
struct A1 {
const int ci; // 錯誤:合成默認構造函數=delete
// A1() = delete; 隱式
};
// 情況2:const類類型成員無默認構造
struct NoDefault { NoDefault(int); };
struct A2 {
const NoDefault nd; // 錯誤:nd無法默認初始化
};
// 情況3:類類型成員無默認構造
struct A3 {
NoDefault nd; // 錯誤:同樣無法默認初始化
};
const int ci = 0; 或 NoDefault nd = NoDefault(42);| 成員類型 | const | 有類內初始值 | 類型有默認構造 | 合成默認構造 |
|---|---|---|---|---|
| 內置類型 | 否 | 無關 | N/A | 正常 |
| 內置類型 | 是 | 無 | N/A | =delete |
| 內置類型 | 是 | 有 | N/A | 正常 |
| 類類型 | 否 | 無 | 無 | =delete |
| 類類型 | 是 | 無 | 無 | =delete |
| 類類型 | 任意 | 有/類型有默認構造 | 任意 | 正常 |
理解這機制對設計可正確構造的類至關重要,特別是涉及const成員與無默認構造類型組合時。