靜態斷言

斷言意味著應該檢查一個條件,如果它是假的,那就是一個錯誤。對於 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 更具體的錯誤訊息。