模板實例化中 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中文網其他相關文章!