【发布时间】:2018-02-17 13:28:23
【问题描述】:
以下代码编译失败:
// 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 会抱怨:error: call to non-constexpr function ‘int S::g() const’。这是完全合理的。但是,如果我将 S 转换为模板,代码就会编译(使用 MSVC 15.3、GCC 7.1.0、clang 4.0.1 检查)。
为什么? constexpr 在类模板中有什么特殊含义吗?
据我了解,这段代码不正确,但标准不要求编译器产生错误(为什么?)。
【问题讨论】:
-
一方面,有趣的行为。另一方面,为什么要从 constexpr 函数调用非 constexpr 函数?
-
@AndyG 这只是一个小例子。在我的例子中,
S是一个模板类,它根据模板参数从不同的基类派生而来。g()在基类中。然后我只在 some 基类中创建了f()constexpr和g()constexpr(constexprness 有意义)。当S派生自非constexprg()的基类时,我很困惑地看到没有编译器错误。因此,问题。 -
最好是这样,因为我们希望能够有一个模板类,其方法可能是 constexpr,具体取决于其模板参数,也可能不是。我不知道标准在哪里允许这样做。
标签: c++ c++11 templates constexpr