簡體   English   中英

請幫助我理解這種語法(在C ++中實現靜態斷言)

[英]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.

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