首頁 >後端開發 >C++ >為什麼未呼叫的模板函式'static_assert”編譯失敗?

為什麼未呼叫的模板函式'static_assert”編譯失敗?

Patricia Arquette
Patricia Arquette原創
2024-11-09 00:35:02600瀏覽

Why Does `static_assert` Fail Compilation for an Uncalled Template Function?

為什麼未呼叫的模板函數 static_assert 編譯失敗?

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

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