GCC 和 clang 之间的 constexpr 差异

Kra*_*nar 6 c++ c++17

以下在 GCC 9 中编译但不在 clang 10 中编译,我想知道这两个编译器中的哪一个符合标准:

template<typename T>
struct A {
  static const T s;
  static const T v;
};

template<typename T>
constexpr const T A<T>::s = T(1);

template<typename T>
constexpr const T A<T>::v = A<T>::s;

int main(int, char**) {
  constexpr auto a = A<double>::v;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一个更大问题的最小例子,这就是为什么字段sv显式声明为const但被定义为constexpr,这是故意的。

GCC 编译该代码是正确的还是 clang 正确拒绝它?

小智 1

编译器只需将static const整型和枚举类型的变量视为constexpr使用常量表达式初始化即可。这使得在constexpr将它们添加到语言之前可以将它们用作数组长度。