首页 > 解决方案 > GCC和clang之间的constexpr差异

问题描述

以下在 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;
}

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

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

标签: c++c++17

解决方案


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


推荐阅读