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]
哪种解释是正确的?
答案 0 :(得分:5)
铿锵是对的。看起来gcc团队中的某人误读或误解了:
7.1.5 / 1:
如果函数或函数模板的任何声明都有
constexpr
说明符,那么它的所有声明都应包含constexpr
说明符。
Foo::kVal
显然不是函数或函数模板。我没有在标准中看到任何其他要求使用constexpr
从一个声明到下一个声明的一致性。
答案 1 :(得分:-1)
您无需申报两次。
class Foo {
public:
static constexpr double kVal = 0.25f;
};
是否需要这一切。