2013-06-12 13 views
5

बजना इस कोड को स्वीकार करता है में अलग है, लेकिन जीसीसी यह खारिज कर दिया:त्रुटि: पुन: घोषणा 'constexpr'

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

const double Foo::kVal; 

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

कौन सा व्याख्या है (बजना 3.0 और जी ++ 4.6.3 का उपयोग करते हुए) सही बात?

उत्तर

5

क्लैंग सही है। यह जीसीसी टीम पढ़ने में भूलना पर किसी को या 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 जाहिर है नहीं एक समारोह या समारोह टेम्पलेट। मुझे मानक में कुछ और नहीं दिख रहा है जिसके लिए constexpr का उपयोग एक घोषणा से अगले तक सुसंगत होना चाहिए।

+0

फ़ंक्शन घोषणा के लिए, क्लैंग और जीसीसी दोनों एक त्रुटि देते हैं। –

+0

@ जोशली: ऐसा इसलिए है क्योंकि यह किसी फ़ंक्शन के लिए अनिवार्य है, लेकिन नियम चर के लिए लागू नहीं होता है। हालांकि, मैं व्यक्तिगत रूप से उनके बीच स्थिरता पसंद करूंगा। –

-1

आपको दो बार घोषित करने की आवश्यकता नहीं है।

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

क्या यह आवश्यक है।

+0

यदि आपको 'केवीएल' का उपयोग एक लाभा के रूप में किया जाता है तो आपको इसकी आवश्यकता होती है। – aschepler

संबंधित मुद्दे