2014-11-25 11 views
28

यह मानक में अनुमति दी है के साथ कक्षाओं के लिए कुल प्रारंभ:सी ++ 11 गैर स्थिर सदस्य initializers

struct A 
{ 
    int a = 3; 
    int b = 3; 
}; 

A a{0,1}; // ??? 

इस वर्ग अभी भी कुल है? clang इस कोड को स्वीकार करता है, लेकिन gcc नहीं है।

उत्तर

36

सी ++ में कक्षा में सदस्य प्रारंभिक होने वाले संरचना/कक्षा को कुल — नहीं बनाता है, हालांकि यह C++ 14 में बदला गया था। यह कुछ आश्चर्यजनक है जब मैंने पहली बार इसमें भाग लिया, इस प्रतिबंध के लिए तर्क यह है कि इन-क्लास प्रारंभकर्ता उपयोगकर्ता परिभाषित कन्स्ट्रक्टर के समान ही हैं लेकिन काउंटर तर्क यह है कि कोई भी वास्तव में उम्मीद नहीं करता है कि कक्षा में शुरुआती लोगों को जोड़ना चाहिए उनकी कक्षा/संरचना एक गैर-कुल, मुझे यकीन नहीं था।

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).

और C++14 में एक ही पैराग्राफ पढ़ता है::

draft C++11 standard अनुभाग 8.5.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).

यह परिवर्तन N3605: Member initializers and aggregates में कवर किया जाता है जो निम्नलिखित सार है:

Bjarne Stroustrup and Richard Smith raised an issue about aggregate initialization and member-initializers not working together. This paper proposes to fix the issue by adopting Smith's proposed wording that removes a restriction that aggregates can't have member-initializers.

यह टिप्पणी मूल रूप से ऊपर अनिच्छा उन्हें समुच्चय होने के लिए अनुमति देने के लिए योग:

Aggregates cannot have user-defined constructors and member-initializers are essentially some kind of user-defined constructor (element) (see also Core Defect 886). I'm not against this extension, but it also has implications on what our model of aggregates actually is. After acceptance of this extension I would like to know how to teach what an aggregate is.

संशोधित संस्करण N3653May 2013 में अपनाया गया था।

अद्यतन

emsr बताते हैं कि G++ 5.0 now supports C++14 aggregates with non-static data member initializers का उपयोग कर या तो std=c++1y या -std=c++14:

struct A { int i, j = i; }; 
A a = { 42 }; // a.j is also 42 

यह live काम कर देखें।

+0

तो ऐसा लगता है कि यह gcc – Bikineev

+0

@Bikineev hmmm द्वारा पूर्ण मानक समर्थन की समस्या नहीं है, आप 'gcc' का किस संस्करण का उपयोग कर रहे हैं? मैं 'gcc' का उपयोग '4.7' से' 4.9' तक' -std = C++ 11' का उपयोग करके पुन: उत्पन्न नहीं कर सकता। क्या आप अपने प्रश्न को स्पष्ट कर सकते हैं, आपने कहा था कि 'क्लैंग' इसे स्वीकार करता है, मुझे लगता है कि आपका मतलब 'जीसीसी' था? –

+0

मैं जीसीसी 4.9.1 का उपयोग करता हूं। मेरा मतलब था कि जीसीसी प्रस्ताव से इस बदलाव का समर्थन नहीं करता है। मुझे मिलता है: "त्रुटि: कॉल करने के लिए कोई मिलान करने वाला फ़ंक्शन 'ए :: ए (<ब्रेस-संलग्न प्रारंभकर्ता सूची>)' – Bikineev

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