靜態斷言
斷言意味著應該檢查一個條件,如果它是假的,那就是一個錯誤。對於 static_assert()
,這是編譯時完成的。
template<typename T>
T mul10(const T t)
{
static_assert( std::is_integral<T>::value, "mul10() only works for integral types" );
return (t << 3) + (t << 1);
}
static_assert()
有一個強制性的第一個引數,即條件,即 bool constexpr。它可能有第二個引數,即訊息,即字串文字。從 C++ 17 開始,第二個引數是可選的; 在此之前,它是強制性的。
Version >= C++ 17
template<typename T>
T mul10(const T t)
{
static_assert(std::is_integral<T>::value);
return (t << 3) + (t << 1);
}
它用於:
- 通常,在 constexpr 值的某些型別上需要在編譯時進行驗證
- 模板函式需要驗證傳遞給它的型別的某些屬性
- 有人想為以下內容編寫測試用例:
- 模板元功能
- constexpr 功能
- 巨集超程式設計
- 某些定義是必需的(例如,C++版本)
- 移植遺留程式碼,關於
sizeof(T)
的斷言(例如,32 位 int) - 程式執行需要某些編譯器功能(打包,空基類優化等)
請注意,static_assert()
不參與 SFINAE :因此,當可能有額外的過載/特化時,不應使用它而不是模板超程式設計技術(如 std::enable_if<>
)。當已經找到預期的過載/特化時,它可能在模板程式碼中使用,但需要進一步的驗證。在這種情況下,它可能提供比依賴 SFINAE 更具體的錯誤訊息。