Constexpr If (False) 區塊中失敗的Static_Assert 行為
C 17 中constexpr if 的介紹引發了對statific這些陳述的非採取分支內。
根據 C 標準,當 constexpr if 語句出現在模板化實體中時,不會實例化非採用分支內的廢棄語句。此規則禁止在範本實例化期間執行具有非依賴錯誤條件的 static_asserts,從而有效地認為程式格式錯誤。
此行為源自於適用於所有模板的更通用規則:如果無法產生有效的專業化對於在constexpr 中帶有子語句的模板,如果其計算結果為false,則該程式被視為格式錯誤,無論該範本是否為
例如,以下程式碼格式不正確,儘管它使用最新版本的Clang進行編譯時不會發出警告:
template< typename T> constexpr void other_library_foo(){ static_assert(std::is_same<T,int>::value); } template<class T> void g() { if constexpr (false) other_library_foo<T>(); }
此行為擴展到對 static_asserts 的間接呼叫。如果 constexpr(模板)函數包含具有非依賴 false 條件的 static_assert,則無法在 constexpr if 語句的非採取分支內呼叫它,即使在單獨的模板中也是如此。
意義和注意事項
constexpr if (false) 區塊中對 static_asserts 的限制可能會影響安全性和constexpr 的用處是作為 SFINAE 的替代品。開發人員必須意識到在此類語句的非採用分支中可能間接呼叫的函數或庫中 static_asserts 的任何潛在使用。
因此,建議避免在可能會導致以下情況的程式碼中使用 static_asserts:作為 constexpr if (false) 區塊的一部分執行。這種做法可確保程式保持格式良好並避免潛在的編譯器警告或錯誤。
以上是為什麼靜態斷言在 C 17 的 `constexpr if (false)` 區塊中失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!