考慮以下模板函數:
template <typename T> inline T getValue(AnObject&) { static_assert(false, "this function has to be implemented for desired type"); }
使用g 4.6.3 進行編譯時,儘管未調用這個函數在任何地方,編譯都會失敗錯誤:
static_assertion failed "this function has to be implemented for the desired type"
此行為可能會引發問題,因為函數未被調用,不應觸發編譯錯誤。但是,根據[temp.res]/8 中的C 標準:
If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
由於沒有可行的方法來實例化具有可編譯的有效專業化的函數模板,因此考慮模板定義本身格式不正確。這允許編譯器甚至在任何實例化發生之前就拒絕它。
要解決此問題並允許延遲錯誤檢測,可以如下修改模板函數:
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"); }
透過使用額外的模板struct foobar 作為編譯時標誌,編譯器無法立即拒絕函數模板。實例化後,foobar
以上是為什麼靜態斷言在未呼叫的模板函數中失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!