5

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]

哪种解释是正确的?

4

2 回答 2

7

叮当是正确的。看起来 gcc 团队中的某个人误读或执行错误:

7.1.5/1:

如果函数或函数模板的任何声明具有constexpr说明符,则其所有声明都应包含说明constexpr符。

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

于 2013-06-12T20:17:56.140 回答
-1

您无需申报两次。

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

这就是所需要的。

于 2013-06-12T20:01:48.130 回答