2011-06-30 25 views
5

Có thể có một liên minh ẩn danh với các thành viên const không? Tôi có những điều sau đây:Người xây dựng và liên danh vô danh với các thành viên const

struct Bar { 
    union { 
    struct { const int x, y; }; 
    const int xy[2]; 
    }; 
    Bar() : x(1), y(2) {} 
}; 

Với G ++ 4.5 Tôi nhận được lỗi:

error: uninitialized member ‘Bar::<anonymous union>::xy’ with ‘const’ type ‘const int [2]’ 
+0

'struct {const int x, y; }; 'không hợp lệ C++. Bạn đang hỏi liệu bạn có thể làm điều gì đó với GCC? –

+0

Tại sao nó không hợp lệ? Liệu nó có cần một constructor với một danh sách khởi tạo không? – user2023370

+0

Công tắc GCC -pedantic có vẻ hữu ích. "ISO C++ cấm các cấu trúc ẩn danh" nó nói. Nếu tôi xóa 'const' ở trên, tôi nhận được cảnh báo tương tự. – user2023370

Trả lời

3

Đây là sự cố trong GCC đã được khắc phục trong phiên bản 4.6. Mã của bạn bây giờ hoạt động tốt.

Nó vẫn phụ thuộc vào phần mở rộng GCC vì nó sử dụng cấu trúc ẩn danh, nhưng hầu hết các trình biên dịch hỗ trợ chúng ngay bây giờ. Ngoài ra, các mã sau đây bây giờ xây dựng đúng với -pedantic:

struct Bar { 
    union { 
    const int x; 
    const int y; 
    }; 
    Bar() : x(1) {} 
}; 

Đó là mã cũng được chấp nhận bởi Clang và Visual Studio 2010 (nhưng không thành công với 2008).

0

Yes. Có thể của nó nhưng bạn đã khởi tạo nó khi nó được xây dựng. Bạn không thể để nó không được khởi tạo. Nhưng trong trường hợp đặc biệt này, tôi không nghĩ rằng nó có thể, vì bạn không thể khởi tạo một mảng trong danh sách khởi tạo.

Bằng cách này, có một cái nhìn tại chủ đề thú vị này:

0

số Hãy thử sử dụng công tắc -pedantic của GCC:

warning: ISO C++ prohibits anonymous structs 

Ví dụ do đó cũng là bất hợp pháp với số bị xóa const.

+0

Tôi sợ điều này không trả lời được câu hỏi. Các cấu trúc ẩn danh bị cấm, nhưng không phải là các tổ chức vô danh. –

+0

@SamHocevar Thankyou! Tôi đánh giá cao sự đóng góp của bạn, nhưng chắc chắn câu trả lời là về mặt kỹ thuật vẫn không: Tôi đang tìm kiếm hợp pháp C++. – user2023370

+0

Có thể bạn có thể chỉnh sửa câu hỏi, sau đó? Nó nói _ "Có thể có một liên minh vô danh với các thành viên const" _ mà câu trả lời dường như là có. Bạn dường như có một vấn đề khác với nặc danh 'struct'. –

Các vấn đề liên quan