static_assert

在編譯時期測試軟體判斷提示。 如果指定的常數表示式為 false,則編譯程式會顯示指定的訊息,如果提供一則訊息,而且編譯失敗並出現錯誤 C2338,否則宣告不會有任何作用。

語法

static_assert( constant-expression, string-literal );

static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)

參數

constant-expression
可以轉換為布林值的整數常數運算式。 如果評估的表達式為零 (false),則會 顯示字串常值 參數,而且編譯失敗並出現錯誤。 如果表達式為非零值 (true),則 static_assert 宣告沒有作用。

string-literal
如果 constant-expression 參數為零,則會顯示訊息。 訊息是編譯程式基底字元集中的字元字串;也就是說,不是多位元組或寬字元

備註

宣告的static_assert常數表達式參數代表軟體判斷提示。 軟體判斷提示會指定您希望在程式中的某個特定點為 true 的條件。 如果條件為 true,宣告 static_assert 就不會有任何作用。 如果條件為 false,判斷提示會失敗,編譯程式會在字串常值參數中顯示訊息,而編譯失敗並出現錯誤。 在 Visual Studio 2017 和更新版本中,字串常值參數是選擇性的。

宣告 static_assert 會在編譯階段測試軟體判斷提示。 相反地 ,assert 宏和_assert和_wassert函 式會在運行時間測試軟體判斷提示,並在空間或時間中產生運行時間成本。 宣告static_assert特別適用於偵錯範本,因為範本自變數可以包含在 constant-expression 參數中

編譯程式會在 static_assert 遇到宣告時檢查語法錯誤的宣告。 如果常數表達式參數不相依於範本參數, 編譯程式會立即評估常數表達式 參數。 否則,編譯程式會在具現化範本時評估 常數表達式 參數。 因此,編譯器可能會在遇到宣告時發出診斷資訊一次,並且在樣板具現化時再次發出訊息。

您可以在命名空間、類別或區塊範圍使用 static_assert 關鍵詞。 (關鍵詞 static_assert 在技術上是宣告,即使它不會在您的程式中引進新的名稱,因為它可以在命名空間範圍中使用。

static_assert具有命名空間範圍的描述

在下列範例中 static_assert ,宣告具有命名空間範圍。 由於編譯器已知 void * 類型的大小,因此會立即計算運算式的值。

範例: static_assert 具有命名空間範圍

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

類別範圍的描述static_assert

在下列範例中 static_assert ,宣告具有類別範圍。 會 static_assert 驗證範本參數是否為一般 舊數據 (POD) 類型。 編譯程式會在宣告時檢查static_assert宣告,但在 類別範本在 中main()具現化之前basic_string,不會評估常數表達式參數。

範例: static_assert 具有類別範圍

#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
    static_assert(std::is_pod<CharT>::value,
                  "Template argument CharT must be a POD type in class template basic_string");
    // ...
    };
}

struct NonPOD {
    NonPOD(const NonPOD &) {}
    virtual ~NonPOD() {}
};

int main()
{
    std::basic_string<char> bs;
}

static_assert使用區塊範圍的描述

在下列範例中 static_assert ,宣告具有區塊範圍。 會 static_assert 驗證 VMPage 結構的大小是否等於系統的虛擬記憶體分頁大小。

範例: static_assert 區塊範圍

#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
    struct VMPage { // ...
           };
    int check_pagesize() {
    static_assert(sizeof(VMPage) == PAGESIZE,
        "Struct VMPage must be the same size as a system virtual memory page.");
    // ...
    }
// ...
};

另請參閱

判斷提示和使用者提供的訊息 (C++)
#error 指示詞 (C/C++)
assert 巨集、_assert、_wassert
範本
ASCII 字元集
宣告和定義