[英]Please help me understand this syntax (implementing static assert in C++)
此語法用作此問題答案的一部分:
template <bool>
struct static_assert;
template <>
struct static_assert<true> {}; // only true is defined
#define STATIC_ASSERT(x) static_assert<(x)>()
我不明白那種語法。 它是如何工作的?
假設我這樣做
STATIC_ASSERT(true);
它被轉換為
static_assert<true>();
怎么辦?
STATIC_ASSERT(true);
確實意味着
static_assert<true>();
評估為空。 static_assert<true>
只是一個沒有任何成員的空結構。 static_assert<true>()
創建該結構的對象,不會將其存儲在任何位置。
這簡單地編譯並且什么都不做。
另一方面
STATIC_ASSERT(false);
手段
static_assert<false>();
這導致編譯錯誤。 static_assert
沒有false
。 所以使用一般形式。 但一般形式如下:
template <bool>
struct static_assert;
這只是一個結構的聲明,而不是它的定義。 因此, static_assert<false>()
會在嘗試創建未定義的結構的對象時導致編譯錯誤。
static_assert<true>();
這樣做
template <>
struct static_assert<true> {}
模板化結構專門化臨時對象創建正在完成 - 對構造函數的調用以及稍后對析構函數的調用,兩者都有望被優化器消除,因為它們什么都不做。 由於只有true
的特殊化而且沒有通用版本的模板結構,所有構造都計算為static_assert<false>();
將不會編譯。
在表達中
static_assert<true>();
因為static_assert<true>
是一個類型,所以它將調用static_assert<true>
的構造函數。 由於static_assert<true>
專用於空結構,因此不會影響任何內容。
但是,在
static_assert<false>();
因為static_assert<false>
沒有專門化,所以通用定義
template <bool>
struct static_assert;
將會被使用。 但是在這里,類型static_assert<B>
是不完整的 。 因此調用static_assert<B>
構造函數會導致編譯錯誤。
因此,這稱為“靜態斷言”,因為如果表達式求值為false
,語句將中止編譯,類似於將在運行時終止程序的正常assert()
函數 。
好吧,我想這是關於模板專業化的。 STATIC_ASSERT(true)將成功編譯,因為存在“static_assert <true>”的定義(不僅僅是聲明)。
STATIC_ASSERT(false)將被編譯器拒絕,因為只有“static_assert <false>”的聲明而且沒有定義。
更新:對於visual studio,STATIC_ASSERT(true)沒問題,但是STATIC_ASSERT(false)觸發錯誤:“錯誤C2514:'static_assert <__ formal>':類沒有構造函數[with __formal = false]”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.