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明らかに関数または関数テンプレートではありません。constexpr1 つの宣言から次の宣言までの一貫性を保つために を使用する必要がある標準は他にありません。

于 2013-06-12T20:17:56.140 に答える