首頁 >後端開發 >C++ >GCC 和 Clang 之間的模板實例化中的「static_assert」行為是否有所不同?

GCC 和 Clang 之間的模板實例化中的「static_assert」行為是否有所不同?

DDD
DDD原創
2024-11-05 01:10:01596瀏覽

Does `static_assert` Behavior Vary in Template Instantiation Between GCC and Clang?

模板實例化中 static_assert 行為的評估

在此程式碼中,使用 static_assert 來驗證非類型模板參數的值回答。然而,該斷言的行為在gcc 和clang 之間有所不同:

<code class="cpp">template <int answer> struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template <> struct Hitchhiker<42> {};</code>

gcc 的行為:

gcc 僅在使用以下參數實例化Hitchhiker時觸發斷言: 42.

clang 的行為:

即使模板未明確實例化,clang 也會引發斷言錯誤。

標準解釋:

C 標準規定,如果模板沒有有效的專業化並且未實例化,則該模板被視為格式錯誤。這意味著不需要診斷。

分析:

兩個編譯器的行為都是正確的。儘管標準不需要,Clang 選擇提供診斷。

替代方法:

要只允許 42 的答案,可以省略通用模板,以及定義如下的專用模板:

<code class="cpp">template <> struct Hitchhiker<42> {};</code>

以上是GCC 和 Clang 之間的模板實例化中的「static_assert」行為是否有所不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn