在編譯期進行條件檢查,失敗則報錯並停止編譯。語法:
static_assert(bool_constexpr, "錯誤訊息字符串");
bool_constexpr:編譯期常量表達式(如 sizeof(void*) == 8)。// 檢查指針大小 static_assert(sizeof(void*) == 8, "僅支援 64 位平台"); // 檢查類型特性 static_assert(std::is_pod::value, "T 必須是 POD 類型"); // 模板中約束參數 template struct Buffer { static_assert(N > 0, "緩衝區大小必須為正"); char data[N]; };
C++11 允許一個構造函數在初始化列表中調用同類的另一個構造函數,避免代碼重複。被委託的構造函數先執行,再執行當前構造函數體。
class A {
void init() { /* 共同初始化 */ }
public:
A() { init(); }
A(int x) { init(); doExtra(x); }
};
class A {
void doExtra(int x) { /* ... */ }
public:
A() { /* 共同初始化 */ }
A(int x) : A() { doExtra(x); } // 委託給無參構造
};
class A {
int a = 99; // 直接在聲明處初始化
std::string s = "hi";
public:
A() = default; // 使用默認構造
A(int x) : A() { a = x; } // 委託後修改
};
A(const A& other) : A() { // 先委託默認構造
a = other.a; // 再複製數據
}
C++03 認為對象在構造函數結束時構造完成;C++11 認為任一構造函數結束時對象即構造完成。因為委託鏈中每個構造函數都在完全構造的對象上執行,派生類構造函數在基類所有委託完成後才執行。
static_assert:將運行期錯誤前移至編譯期,提升庫代碼健壯性。