下面的代碼編譯失敗:Constexpr成員函數
// template<class>
struct S {
int g() const {
return 0;
}
constexpr int f() const {
return g();
}
};
int main()
{
S /*<int>*/ s;
auto z = s.f();
}
GCC,例如,抱怨:錯誤:調用非constexpr函數 '的int ::克()const的' 。這是完全合理的。但如果我將S放入模板中,代碼將編譯(使用MSVC 15.3,GCC 7.1.0,clang 4.0.1進行檢查)。
爲什麼? constexpr在類模板中有什麼特殊含義?
據我瞭解,這段代碼是不正確的,但標準並不要求編譯器產生錯誤(爲什麼?)。
一方面,有趣的行爲。另一方面,爲什麼從constexpr函數中調用一個非constexpr函數呢? – AndyG
@AndyG這只是一個簡單的例子。在我的情況下,'S'是一個模板類,根據模板參數從不同的基類派生。 'g()'在基類中。然後我做了''()''constexpr',並且只在_some_基類('constexpr'ness有意義)中創建了'g()''constexpr'。當'S'由非'constexpr'' g()'派生的基類時,我感到困惑,因此沒有發現編譯器錯誤。因此,這個問題。 – Evgeny
最好是,因爲我們希望能夠擁有一個模板類,這個模板類可能是constexpr的方法,這取決於它的模板參數,也可能不是。我不知道這個標準在哪裏是允許的。 – Yakk