2013-04-14 6 views
6

C++ 11 I stwierdzenie następujący związek:Czy w C++ 11 dozwolone są nieanonimowe związki zawierające statyczne elementy danych?

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

Kiedy kompilacji kod g ++ 4.7.0 pomocą -std = C++ 11 -pedantic-błędów, pojawia się następujące błędy (z moll edycja):

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

FDIS (N3242) nie pozwalają jednoznacznie statycznych członków danych nazwanych związków, o ile widzę. Ale nie widzę również, gdzie FDIS nie może statycznych elementów danych nazwanych związków albo FDIS wielokrotnie odnoszą się do tego, co można zrobić z "niestatycznych członków danych" [sekcja 9.5 pkt 1]. W przeciwieństwie do tego sugeruje to, że standard dopuszcza statycznych członków danych związków.

Nie mam żadnego sensu dla statycznych członków danych związku. Gdybym tego potrzebował, prawdopodobnie mógłbym osiągnąć wystarczająco bliski efekt w klasie zawierającej anonimowy związek. Po prostu próbuję zrozumieć intencje normy.

Dzięki za pomoc.

+2

Po pierwsze, lokalne typy klas nie mogą mieć statycznych elementów danych w ogóle ("§9.4.2/5"), stąd pierwszy błąd. Dla statycznych elementów danych w nielokalnym 'union' Clang kompiluje się dobrze. – Xeo

Odpowiedz

4

Tak, jest to dozwolone. Sekcja 9 standardu używa słowa class dla klas, struktur i związków, chyba że wyraźnie zaznacza inaczej. Jedyne ograniczenia dotyczące statycznych członków związku dotyczą lokalnych związków (9.4.2/5) i anonimowych związków (9.5/5).

#include <iostream> 

union Test 
{ 
    static int s; 
}; 

int Test::s; 

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

Wyjście na LiveWorkSpace. Zauważ, że kompiluje się na Clang 3.2, ale nie na gcc 4.8.0 lub Intel 13.0.1. Wygląda na to, że jest to błąd gcc/Intel.

+0

sed s/Wyjście na Ideone/Wyjście na LiveWorkspace/g – niXman

+0

@niXman tnx, naprawiony! – TemplateRex

+0

@rhalbersma Wow. Niezła odpowiedź. Dziękuję bardzo. Jako dodatkową korzyść z tej odpowiedzi dowiedziałem się, że istnieją różnice między związkami lokalnymi i nielokalnymi. Aha, a powodem, dla którego lokalny związek nie może mieć statycznego członka, jest to, że nie ma sposobu, aby zadeklarować magazynowanie [czoło palcem uderza]. Dzięki jeszcze raz. – sschurr