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 theconstexpr
specifier.
Foo::kVal
显然不是函数或函数模板。我在标准中没有看到任何其他要求使用 constexpr
来使一个声明与下一个声明保持一致。
关于c++ - 错误 : redeclaration differs in ‘constexpr’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17074089/