首頁 >後端開發 >C++ >為什麼靜態斷言在未呼叫的模板函數中失敗?

為什麼靜態斷言在未呼叫的模板函數中失敗?

Susan Sarandon
Susan Sarandon原創
2024-11-12 07:58:011007瀏覽

Why Does a Static Assertion Fail in an Uncalled Template Function?

儘管未呼叫模板函數,Static_Assert 仍失敗

考慮以下模板函數:

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中文網其他相關文章!

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