使用模板 static_assert 時,預計只有在實例化模板函數時斷言才會失敗。然而,在某些情況下,就像下面提出的那樣,甚至在調用函數之前編譯就會失敗:
template <typename T> inline T getValue(AnObject&) { static_assert(false , "this function has to be implemented for desired type"); }
根據[temp.res]/ 中的C 標準8:
「如果無法為模板定義產生有效的專業化,且該模板未實例化,則模板定義格式錯誤,無法診斷必需。」
在提供的模板中,無法產生有效的專業化,因為static_assert 條件始終為false。因此,模板定義的格式不正確。即使沒有實例化,編譯器也可能會提前拒絕它。
要解決此問題,可以如下修改模板:
template<typename T> struct foobar : std::false_type { }; template <typename T> inline T getValue(AnObject&) { static_assert( foobar<T>::value , "this function has to be implemented for desired type"); }
這樣,編譯器無法立即拒絕函數模板,因為它需要在評估static_assert 條件之前實例化foobar 的適當特化。因此,只有在函數實際實例化並且斷言失敗時才會出現編譯錯誤。
以上是為什麼未呼叫的模板函式'static_assert”編譯失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!