是否允许比较 static_assert 中静态类字段上的指针?

Fed*_*dor 7 c++ static-assert language-lawyer

我试图static_assert通过比较静态字段上的指针来验证程序是否真的有两个从模板生成的不同类。经过一些简化后,程序如下所示:

template<int N> struct C { 
    static int x; 
};

template<int N> int C<N>::x = 0;

int main() { 
    static_assert(&C<0>::x != &C<1>::x); 
}
Run Code Online (Sandbox Code Playgroud)

Clang 没问题,但 GCC 打印错误:

error: non-constant condition for static assertion
Run Code Online (Sandbox Code Playgroud)

演示:https : //gcc.godbolt.org/z/o6dE3GaMK

我想知道在编译时是否真的允许进行这种类型的检查?

Fed*_*dor 2

允许对静态类成员的指针进行编译时相等比较。

原始代码的问题仅出现在 GCC 中,并且是由于旧的 GCC bug 85428造成的。

为了解决这个问题,可以显式实例化模板,如下所示:

template<int N> struct C { 
    static int x; 
};

template<int N> int C<N>::x = 0;

template struct C<0>;
template struct C<1>;

int main() { 
    static_assert(&C<0>::x != &C<1>::x); 
}
Run Code Online (Sandbox Code Playgroud)

该程序现已被所有3个主要编译器接受,演示: https: //gcc.godbolt.org/z/Kss3x8GnW