以下在 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;
}
这是一个更大问题的最小示例,这就是为什么字段
s
和 v
明确声明为 const
但被定义为 constexpr
,这是故意的。GCC 编译该代码是正确的还是 clang 正确拒绝它?
最佳答案
编译器只需要处理 static const
整数和枚举类型的变量为 constexpr
如果它们是用常量表达式初始化的。这使得在 constexpr
之前将它们用作数组长度成为可能。被添加到语言中。
关于c++ - GCC 和 clang 之间的 constexpr 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61606637/