以下编译没有错误:
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,
答案 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
。