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 字元集
宣告和定義
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應