2013-06-12 7 views
5

Clang przyjmuje ten kod, a GCC odrzuca:błędu: ponowna różniące się constexpr '

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

const double Foo::kVal; 

(za pomocą szczęk 3,0 i 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] 

które jest interpretacja poprawny?

Odpowiedz

5

clang jest poprawny. Wygląda to tak, jakby ktoś na gcc zespołu misread lub misimplemented:

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 jest oczywiście funkcja lub funkcja nie jest szablon. W standardzie nie widzę niczego, co wymagałoby użycia numeru constexpr, aby było zgodne z jedną deklaracją.

+0

Dla deklaracji funkcji zarówno clang, jak i gcc dają błąd. –

+0

@JoshLee: Dzieje się tak dlatego, że funkcja jest obowiązkowa, ale reguła nie ma zastosowania do zmiennych. Chociaż osobiście wolałbym spójność między nimi. –

-1

Nie musisz zadeklarować dwa razy.

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

To wszystko, co jest potrzebne.

+0

Potrzebujesz, jeśli 'kVal' jest używane jako l-wartość. – aschepler