从成员变量访问静态constexpr成员,GCC错误?

时间:2019-03-11 16:05:38

标签: c++ templates compiler-errors compiler-bug

以下编译没有错误:

template<int j, int i>
struct TemplateClass { 
    int arr[i];
};
struct A {
    inline static constexpr int n = 123; 
};
template<int j> struct B {
    void func() {
        A a;
        TemplateClass<j, a.n> c;
    }
};
int main() {
  B<456> b;
  b.func();
}

但是,使用GCC进行编译,如果我们将变量{{1的成员变量设置为变量,则会得到错误“在常量表达式中使用'this'” 。 }}在函数A a中,如下所示:

func

使用MSVC编译不会产生任何错误。 Compare the two compilers

  • 我不明白为什么这会导致错误。这是一个错误吗?
  • 是否有解决此错误的方法?

1 个答案:

答案 0 :(得分:3)

GCC是正确的。模板参数必须是一个常量表达式,并且a.n隐式表示this->a.n,因为a是封闭类的成员。但是,常量表达式求值不能访问非this成员函数([expr.const] /2.1)中的constexpr。即使为了获得静态成员this的值而对n的评估似乎是不必要的,但该标准仍要求对a(即this->a)进行评估,即使其不需要价值;参见[expr.ref] / 1及其脚注。

如果func被标记为constexpr,GCC将接受您的代码。正如评论中指出的那样,最好只写A::n