2013-06-12 24 views
5

'constexpr' farklıdır, ancak GCC reddeder:Hata: yeniden bildirilmiş Clang bu kodu kabul

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

const double Foo::kVal; 

yorumudur

~$ 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] 

(çınlama 3.0 ve g ++ 4.6.3 kullanarak) doğru?

cevap

5

clang doğrudur. Bu gcc takım misread üzerinde biri veya misimplemented benziyor:

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 değil bir işlev veya işlev şablonu besbelli. Bir bildirimden diğerine tutarlı olması için constexpr standardının kullanılmasını gerektiren başka bir şey göremiyorum.

+0

Bir işlev bildirimi için hem clang hem de gcc bir hata verir. –

+0

@JoshLee: Bir işlev için zorunlu olması, ancak kuralın değişkenler için geçerli olmaması nedeniyle. Yine de, ben şahsen aralarında tutarlılığı tercih ederim. –

-1

İki kere bildirmeniz gerekmez.

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

Tüm bunlar gerekli.

+0

Eğer 'kVal' bir lvalue olarak kullanılsın. – aschepler