2013-04-14 24 views
6

Trong C++ 11 Tôi tuyên bố sự kết hợp sau đây:Có phải C++ 11 cho phép các tổ chức không giấu tên có chứa các thành viên dữ liệu tĩnh không?

union U4 { 
    char c; 
    int i; 
    static int si; 
}; 

Khi tôi biên dịch mã này với g ++ 4.7.0 sử dụng -std = C++ 11 -pedantic-lỗi, tôi nhận được các lỗi sau đây (với chỉnh sửa nhỏ):

error: local class ‘union U4’ shall not have static data member ‘int U4::si’ [-fpermissive]
error: ‘U4::si’ may not be static because it is a member of a union

các doanh nghiệp FDI (N3242) không rõ ràng phép thành viên dữ liệu tĩnh của công đoàn được đặt tên, như xa như tôi có thể nhìn thấy. Nhưng tôi cũng không thấy nơi FDIS không cho phép thành viên dữ liệu tĩnh của các tổ chức được đặt tên hoặc FDIS liên tục tham khảo những gì có thể được thực hiện với "thành viên dữ liệu không tĩnh" [phần 9.5 đoạn 1]. Ngược lại, điều đó cho thấy tiêu chuẩn cho phép các thành viên dữ liệu tĩnh của các công đoàn.

Tôi không có ý định sử dụng nào cho một thành viên dữ liệu tĩnh của một công đoàn. Nếu tôi cần nó tôi có thể có thể có được một hiệu ứng đủ gần với một lớp học có chứa một liên minh vô danh. Tôi chỉ cố hiểu mục đích của tiêu chuẩn.

Cảm ơn sự giúp đỡ.

+2

Trước hết, loại lớp địa phương không được phép có thành viên dữ liệu tĩnh nói chung ('§9.4.2/5'), do đó, đó là nơi lỗi đầu tiên của bạn xuất phát. Đối với thành viên dữ liệu tĩnh trong một liên kết không phải cục bộ, «Clang» biên dịch tốt. – Xeo

Trả lời

4

Có điều này được cho phép. Phần 9 của Tiêu chuẩn sử dụng từ class cho các lớp học, cấu trúc và công đoàn, trừ khi nó đề cập rõ ràng về mặt khác. Các hạn chế duy nhất đối với các thành viên công đoàn tĩnh là cho các công đoàn địa phương (9.4.2/5) và cho các công đoàn vô danh (9.5/5).

#include <iostream> 

union Test 
{ 
    static int s; 
}; 

int Test::s; 

int main() 
{ 
    Test::s = 1; 
    std::cout << Test::s; 
} 

Đầu ra trên LiveWorkSpace. Lưu ý rằng nó biên dịch trên Clang 3.2 nhưng không phải trên gcc 4.8.0 hoặc Intel 13.0.1. Có vẻ đây là lỗi gcc/Intel.

+0

sed s/Đầu ra trên Ideone/Đầu ra trên LiveWorkspace/g – niXman

+0

@niXman tnx, đã được sửa! – TemplateRex

+0

@rhalbersma Wow. Câu trả lời hay. Cảm ơn rất nhiều. Như một lợi ích bổ sung từ câu trả lời này tôi đã học được rằng có sự khác biệt giữa các công đoàn địa phương và phi địa phương. Oh, và lý do một công đoàn địa phương không thể có một thành viên tĩnh là không có cách nào để khai báo lưu trữ [trán trán cọ]. Cảm ơn một lần nữa. – sschurr