c++ - 错误 : redeclaration differs in ‘constexpr’

标签 c++ c++11 g++ constexpr clang++

Clang 接受这段代码,但 GCC 拒绝它:

class Foo {
 public:
  static constexpr double kVal = 0.25f;
};

const double Foo::kVal;

(使用 clang 3.0 和 g++ 4.6.3)

~$ clang++ foo.cc -std=c++11 -c 
[ok]
~$ g++ foo.cc -std=c++0x -c 
foo.cc:6:19: error: redeclaration ‘Foo::kVal’ differs in ‘constexpr’
foo.cc:3:34: error: from previous declaration ‘Foo::kVal’
foo.cc:6:19: error: declaration of ‘constexpr const double Foo::kVal’ outside of class is not definition [-fpermissive]

哪种解释是正确的?

最佳答案

clang 是正确的。看起来 gcc 团队中有人误读或错误实现了:

7.1.5/1:

If any declaration of a function or function template has constexpr specifier, then all its declarations shall contain the constexpr specifier.

Foo::kVal 显然不是函数或函数模板。我在标准中没有看到任何其他要求使用 constexpr 来使一个声明与下一个声明保持一致。

关于c++ - 错误 : redeclaration differs in ‘constexpr’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074089/

相关文章:

c++ - static_pointer_cast 通过继承和模板

c++ - 使用重载 -> 运算符的返回值的语法

c++ - 我应该对类中的所有值使用 setValues 吗?

c++ - C++ 前缀递增运算符返回左值这一事实的实际应用

c++ - 创建大型 std::array 会导致段错误?

c++ - 为可变参数模板添加的新语法实体的名称是什么?

c++ - 获取程序中的当前优化级别

c++ - C++ 类中定义的友元函数的成员访问控制

c++ - boost::用元组仿函数转换给出了奇怪的警告

c++ - 如何将 `char *` 深度复制到 std::stringstream?