c++ - GCC 和 clang 之间的 constexpr 差异

标签 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;
}

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

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

最佳答案

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

关于c++ - GCC 和 clang 之间的 constexpr 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61606637/

相关文章:

c++ - 为什么 return SFINAE 转换运算符不起作用?

c++ - 将参数省略复制为返回值

C++ 字符串连接

c++ - 如何检查范围内的元素是否应该移动?

c++ - 为什么要尝试调用默认构造函数?

c++ - 无法 move std::any

c++ - 在模板化函数中使用 unique_ptr<int[]>、vector<int> 和 int[]

c++ - 编写更通用的指针代码

c++ - 在启用自动(基于扩展)选项的情况下,IAR 无法正确编译 C++ 文件

c++ - 为什么 std::find_if(first, last, p) 不通过引用获取谓词?