2013-01-06 21 views
12

Poniższy przykładowy kod kompiluje dobrze w Visual C++:C++ prywatny modyfikator ignorowane na zagnieżdżonego anonimowej struktury

class Test { 
private: 
    struct { 
     struct { 
      int privateData; 
     }; 
    }; 
}; 

int main(int, char **) 
{ 
    Test test; 
    test.privateData = 0; 
    return 0; 
} 

ale dlaczego? Spodziewam się błędu kompilatora, ponieważ element privateData powinien być niedostępny dla funkcji main, ponieważ powinien on być private, podobnie jak kontener tego kontenera. Wiem, że bezimienne struktury nie są częścią oficjalnego C++, ale ten projekt jest asinine.

Nawiasem mówiąc Próbowałem również zmienić private do protected i struct do union: wygląda na to, że kompilator odmawia cześć modyfikatory dostępu na anonimowych kodowanym i związków, które są zagnieżdżone wewnątrz innego anonimowego struct lub Unii.

Czy ktoś może wyjaśnić tę funkcję?

+3

To brzmi jak błąd, który został naprawiony w _VS2005sp1_, której wersji używasz? Należy pamiętać, że _anonimowe structs_ nie są standardową funkcją _C++ _ ... –

+0

nie, używam VS 2012 –

+2

@ K-ballo gcc również kompiluje to ... –

Odpowiedz

6

Tak, to błąd. Microsoft potwierdził, że jest to raport opinii is here.

Obecnie błąd jest w stanie "nie naprawia" i nie jest jasne, kiedy (jeśli w ogóle) będzie adresowany. Istnieje nieco dziwne obejście tego problemu, parser IntelliSense wbudowany w Visual Studio, napisany przez Edison Design Group, narzeka na to. Otrzymujesz czerwone zawijasy i komunikat:

Error: member "Test.privateData" (declared at line 10) is inaccessible

+2

Sugerujesz, że są hordy programiści przesiedlonych w czasie, którzy _rely_ na specyfikatory dostępu nieprawidłowo kaskadowanie przez dwa poziomy anonimowych struktur? –

+0

@LightnessRacesinOrbit Zrozumiałem, że nie ma hord, ale paczki, które lubią używać "obejść" Microsoftu, i dla tych ludzi nie naprawiają tego i podobnych problemów. Zamiast tego oznaczyli to swoim parserem kodu. –

+0

@ BЈовић: Wydaje mi się, że jest to przypadek z niewiarygodnie wąską krawędzią, która nie byłaby warta takich rozważań, _even_, gdy nie ma najmniejszej szansy na naprawienie tego ... –