簡體   English   中英

使用c ++中的模板編譯時斷言

[英]Compile-time assert using templates in c++

我正在閱讀來自谷歌( https://code.google.com/p/cpp-btree/ )的cpp-btree庫的代碼,並且我遇到了編譯時斷言機制。

// A compile-time assertion.
template <bool>
  struct CompileAssert {
};

#define COMPILE_ASSERT(expr, msg) \
  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]

所以我或多或少地了解它的作用,如果編譯器將expr評估為false,它將聲明一個新類型的msg,它將是一個大小為-1的CompileAssert <false>數組,它將觸發編譯錯誤。

我沒有得到的是bool(expr)部分,這究竟是什么? 某種類型的bool類復制構造函數的調用? (但它是一個內置類型,所以我很困惑)我雖然這將是一個機制,當expr不是一個布爾值時引發編譯錯誤但實際上我設法編譯一個短程序惠特該行

COMPILE_ASSERT("trash",error_compilation_assert);

用gcc 3.4編譯就好了

那么任何人都可以解釋bool(expr)機制的一部分嗎?

這是一種類型轉換。 C ++中有3種主要類型的轉換:

  • 演員表示法(C風格演員):( (bool) expr

  • 功能表示法(構造函數樣式轉換): bool(expr)

  • Cast運算符(C ++ - 樣式轉換); static_cast<bool>(expr)

Cast符號和函數符號在語義上是等價的(即它們都執行最強的轉換,C-cast),但函數符號的范圍和優先級更清晰。

通常建議不要在C ++代碼中使用它們,而是使用特定的static_cast const_cast操作符( const_caststatic_cast等)。

因此,在您的代碼中,它只是強制值鍵入bool並同時將其括在括號中的一種方式,因此不會出現運算符優先級問題。

bool(expr)expr轉換為bool

第一個參數應該是某種表達式,例如a == b 在這里使用字符串文字是沒用的。

bool(expr)是一個函數式轉換器,它將表達式轉換為bool。 很多東西都隱含地轉換為bool,但我猜他們想要一個顯式的強制轉換來確保結果是一個bool。

如果將指針轉換為bool,則如果它是NULL指針則計算結果為false,否則為true。 你的字符串文字“Trash”衰變為第一個const char *const char * 由於這不是空指針,因此表達式的計算結果為true。

bool(expr)嘗試隱式或使用任何用戶定義的轉換運算符將expr轉換為bool。

在C ++中,您可以使用ctor語法實例化內置類型:

bool b1 = bool(true);
bool b2 = bool(b1);

區別在於:

bool b2 = b1;

是后者隱含轉換為bool。 當不允許這樣的隱式轉換時(如模板中的typedef), bool(b1)通過從b1創建臨時bool使其顯式化,並且不再需要轉換臨時轉換; 這是一個真正的bool類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM