2015-10-02 21 views
11

पर विचार करें निम्नलिखित घोषणा:std :: array के इनलाइन प्रारंभिकरण में क्या गलत है?

#include <array> 

struct X 
{ 
    //std::array<bool,3> arr={false,false,false}; 
    bool brr[3]={false,false,false}; 
}; 

के रूप में है, यह छ ++ 5.2 से सामान्य रूप से संकलित करता है। लेकिन अगर मैं std::array uncomment, मैं कोई त्रुटि मिलती है:

test.cpp:5:46: error: array must be initialized with a brace-enclosed initializer 
    std::array<bool,3> arr={false,false,false}; 
              ^
test.cpp:5:46: error: too many initializers for ‘std::array<bool, 3u>’ 

OTOH, इस घोषणा main() अंदर समस्याओं के बिना काम करता है। इसके अलावा, निम्नलिखित आरंभ struct X अंदर काम करता है:

std::array<bool,3> arr={{false,false,false}}; 

मैं struct परिभाषा एकल ब्रेसिज़ के साथ सरल आरंभीकरण का उपयोग क्यों नहीं कर सकते हैं?

+1

ध्यान दें, सी ++ 11 के रूप में सी ++ 14 करने का विरोध किया वर्ग initializers में होने [बनाता में:

ब्रेसिज़ के एक आंतरिक सेट का उपयोग बग रिपोर्ट में बताया गया है एक संभव काम के आसपास है एक गैर-समेकित स्ट्रैट] (http://stackoverflow.com/q/27118535/1708801)। –

उत्तर

22

यह एक जीसीसी बग की तरह दिखता है: Bug 65815 - brace elision doesn't work in NSDMI। रिपोर्ट में कहा गया:

On Page 975 of "The C++ Programming Language", 4th edition, Bjarne Stroustrup says:

"An array can be initialized by an initializer list: array a1 = { 1, 2, 3 };"

and Clang (V 3.5) accepts it. However, G++ 4.9.2 thinks this is an error:

"error: array must be initialized with a brace-enclosed initializer 
    const std::array<double, 3> _ar0val = {1.0, -1.0, 1.0};" 

समस्या निम्न परीक्षण का मामला तक ही सीमित था:

struct array { 
    int data [2]; 
}; 

struct X { 
    array a = { 1, 2 }; 
}; 

ऐसा लगता है कि ठीक तरह सिर संशोधन में है, ऑप्स कोड है कि संशोधन, see it live में काम करता है।

std::array<bool,3> arr={ {false,false,false} }; 
         ^    ^
संबंधित मुद्दे