Pytanie Prywatny modyfikator C ++ jest ignorowany na zagnieżdżonej anonimowej strukturze


Poniższy przykładowy kod kompiluje się dobrze w Visual C ++:

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

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

Ale dlaczego? Spodziewałbym się błędu kompilatora, ponieważ privateData członek powinien być niedostępny dla funkcji głównej, ponieważ tak powinno być private podobnie jak jego kontener. Wiem, że nienazwane struktury nie są częścią oficjalnego C ++, ale ten projekt jest niedorzeczny.

Przy okazji też próbowałem się zmienić private w protected i struct w union: wygląda na to, że kompilator odmawia honorowania modyfikatorów dostępu w anonimowych strukturach i związkach, które są zagnieżdżone w innej anonimowej strukturze lub unii.

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


12
2018-01-06 22:50


pochodzenie


To brzmi jak błąd, który został naprawiony VS2005sp1, Jakiej wersji używasz? Weź pod uwagę, że anonimowe struktury nie są standardem C ++ cecha... - K-ballo
@ K-ballo gcc również kompiluje to ... - Luchian Grigore
BTW, intellisense nie narzeka, ale mimo to kompiluje - SomeWittyUsername
Clang 4.0 nie kompiluje tego z błędem "error:" privateData "jest prywatnym członkiem" Test ""
Działa poprawnie, jeśli umieścisz private: w pierwszej anonimowej strukturze, a następnie zagnieżdżać pod nią wiele anonimowych struktur. Odpowiedź brzmi: "to błąd". - JCooper


Odpowiedzi:


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

W tej chwili błąd jest w stanie "nie naprawia" i nie jest jasne, kiedy (jeśli kiedykolwiek) 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:

Błąd: członek "Test.privateData" (zadeklarowany w linii 10) jest niedostępny


6
2018-01-10 00:43



Sugerujesz, że istnieją hordy deweloperów przesiedlonych w czasie, którzy polegać na specyfikatory dostępu nieprawidłowo kaskadowanie przez dwa poziomy anonimowych struktur? - Lightness Races in Orbit
@LightnessRacesinOrbit Zrozumienie, że nie ma hord, ale paczka, która lubi używać "obejść" Microsoftu, i dla tych ludzi nie naprawiają tego i podobnych problemów. Zamiast tego zaznaczają to swoim parserem kodu - BЈовић
@ BЈовић: To po prostu wydaje mi się jak niewiarygodnie wąska krawędź, która nie byłaby warta takich rozważań, parzysty gdy nie ma również prawdopodobnie niewielkiej korzyści w jego naprawie ... - Lightness Races in Orbit
@LightnessRacesinOrbit Good. Zgadzamy się :) - BЈовић
@LightnessRacesinOrbit jak Luchian Grigore zauważa w komentarzu do pytania, ten "błąd" może być z powodzeniem odtworzony w gcc. Rozumiem, że nie jest to kwestia przypadku i wymagania dotyczące kompatybilności mogą być dobrym powodem do poparcia obecnego projektu. - GOTO 0