2015-10-02 13 views
11

xem xét việc kê khai như sau:Điều gì xảy ra với việc khởi tạo nội tuyến của std :: array?

#include <array> 

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

Như là, nó biên dịch thông thường bằng g ++ 5.2. Nhưng nếu tôi bỏ ghi chú std::array, tôi nhận được một lỗi:

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, tuyên bố này hoạt động mà không vấn đề bên trong main(). Ngoài ra, khởi tạo sau không hoạt động bên trong struct X:

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

Tại sao tôi không thể sử dụng khởi tạo đơn giản với dấu ngoặc đơn trong định nghĩa struct?

+1

Lưu ý, trong C++ 11 như trái ngược với C++ 14 có trong initializers lớp [làm cho strut một không tổng hợp] (http://stackoverflow.com/q/27118535/1708801). –

Trả lời

22

Điều này trông giống như lỗi gcc, xem: Bug 65815 - brace elision doesn't work in NSDMI. Báo cáo cho biết:

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};" 

Vấn đề này đã được thu hẹp xuống test sau:

struct array { 
    int data [2]; 
}; 

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

Dường như việc sửa chữa là trong phiên bản đầu, mã Ops làm việc trong phiên bản đó, see it live.

Như đã trình bày trong báo cáo lỗi sử dụng một bộ bên trong của niềng răng là một công việc xung quanh có thể:

std::array<bool,3> arr={ {false,false,false} }; 
         ^    ^
Các vấn đề liên quan