2015-04-01 8 views
6

मैं निर्माताओं के लिए मूल्य-प्रारंभ के साथ सदस्यों के लिए मूल्य-आरंभीकरण उपयोग करने का प्रयास (अगर मैं वास्तव में अच्छा शब्दों का प्रयोग मैं नहीं जानता ...)वर्दी और मूल्य-प्रारंभ

तो ... जब मैं निर्धारित करें:

struct A 
{ 
    int a_; 
}; 

मैं उपयोग करने में सक्षम हूँ:

A a{5}; 
assert(m.a_==5); 

हालांकि, अगर मैं सदस्य ब्रेस प्रारंभकर्ता और एक आरंभीकरण-सूची निर्माता का उपयोग करना चाहते

struct B 
{ 
    int b_ {1}; 
}; 

यह संकलन नहीं करता है (++ 14 c: http://ideone.com/MQ1FMU):

B b{2}; 

यहाँ त्रुटि है:

prog.cpp:19:7: error: no matching function for call to 'B::B(<brace-enclosed initializer list>)' 
    B b{2}; 
    ^
prog.cpp:19:7: note: candidates are: 
prog.cpp:10:8: note: constexpr B::B() 
struct B 
     ^
prog.cpp:10:8: note: candidate expects 0 arguments, 1 provided 
prog.cpp:10:8: note: constexpr B::B(const B&) 
prog.cpp:10:8: note: no known conversion for argument 1 from 'int' to 'const B&' 
prog.cpp:10:8: note: constexpr B::B(B&&) 
prog.cpp:10:8: note: no known conversion for argument 1 from 'int' to 'B&&' 

क्या है अंतर, अवधारणा के लिहाज से? बहुत धन्यवाद!

+0

ठीक है मैंने सोचा था कि ऐसा इसलिए था क्योंकि 'बी' कुल नहीं था, लेकिन वास्तव में यह अपेक्षाओं को पूरा करता है जहां तक ​​मैं कह सकता हूं। यह बस गैर-तुच्छ है। –

+1

ध्यान दें कि Ideone.com पर "सी ++ 14" जी ++ - 4.9.2 है, जो सी ++ 14-अनुरूप नहीं है (जैसा कि इस संकलन त्रुटि से प्रमाणित है!) – Casey

उत्तर

2

सी ++ 11 नियमों के तहत, B कुल योग नहीं है। सी ++ 11 [dcl.init.aggr]/1:

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal-initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

B केवल एक डिफ़ॉल्ट निर्माता है, और इस तरह braced-प्रारंभकर्ता-सूची{2} से आरंभ नहीं किया जा सकता है।

सी ++ 14 कुल मिलाकर गैर स्थैतिक डेटा सदस्यों के लिए ब्रेस-या-बराबर प्रारंभिक की अनुमति देता है। N4140 [dcl.init.aggr]/1:

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

काफी सीधी-सपाट अर्थ विज्ञान के साथ

: खेतों जिसके लिए कोई प्रारंभकर्ता निर्दिष्ट है यदि कोई हो, उनके ब्रेस या बराबर-प्रारंभकर्ता से प्रारंभ कर रहे हैं, और नहीं तो {} [dcl.init.aggr]/7 के साथ प्रारंभ:

If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from its brace-or-equal-initializer or, if there is no brace-or-equal-initializer, from an empty initializer list (8.5.4).

आपका कार्यक्रम इस प्रकार मान्य है सी ++ 14 (DEMO)। अनिवार्य रूप से, C12+ 11 में ब्रेस-या-बराबर-प्रारंभकर्ता एस की निषेध एक गलती थी जिसे सी ++ 14 सही किया गया था।

+0

विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद! मुझे लगता है कि मुझे सुनिश्चित करने के लिए एक और सी ++ 14 कंपाइलर के साथ परीक्षण किया जाना चाहिए था ... – fp12

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