下面的代码编译失败: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