GCC和clang之间的constexpr差异

constexpr differences between GCC and clang

本文关键字:constexpr 差异 之间 clang GCC      更新时间:2024-05-10

以下是在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编译该代码是正确的,还是clang拒绝它是正确的?

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