2013-07-19 12 views
9

Byłem zaskoczony, gdy zobaczyłem, że ten sukces kodu skompilowany z MS Visual C++.Słowo kluczowe struct before constructor name

struct foo { 
    struct foo(int i): value(i) {} 
    int value; 
}; 

Co oznacza słowo kluczowe struct w takim dziwnym kontekście?

+0

Nie kompiluje się dla mnie z G ++ 4.8. Ale kompilator MS vs2010 to akceptuje. Pachnie jak dziwny błąd parsowania. Z jakiego kompilatora korzystasz? – SteveLove

+0

[tag: Visual-C++], kompilator MS. Przepraszam, muszę to napisać przy opisie. –

+0

Dlaczego spadki? Pytanie jest poprawne i rzeczywiście kompiluje się w VC++ (przynajmniej VC++ 2010) bez ostrzeżeń. Brak znajomości odpowiedzi nie jest powodem do zgonu. To nie jest zgodne ze standardem. – Gorpik

Odpowiedz

10

W większości kontekstów, można użyć typu rozbudowany specyfikatorstruct foo lub równoważnie class foo, zamiast tylko nazwy klasy foo. Może to być przydatne do rozwiązywania niejasności:

struct foo {}; // Declares a type 
foo foo;  // Declares a variable with the same name 

foo bar;  // Error: "foo" refers to the variable 
struct foo bar; // OK: "foo" explicitly refers to the class type 

Jednakże, nie można korzystać z tej formy podczas deklarowania konstruktora, więc kompilator jest źle przyjąć ten kod. Specyfikacja deklaracji konstruktorów (w C++ 11 12.1/1) dopuszcza tylko nazwę klasy, a nie spreparowany specyfikator typu.

Generalnie nie powinieneś się dziwić, gdy Visual C++ kompiluje wszystkie rodzaje kodów. Jest znany z niestandardowych rozszerzeń tego języka.

+0

Jest jeszcze jeden dodatek: domyślne ustawienia klasy do dziedziczenia prywatnego, podczas gdy struct domyślnie public. –

+5

@ IanM_Matrix1: To jest różnica między używaniem 'class' i' struct' w definicji klasy; ale nie mówimy tu o definicjach klas, wystarczy specyfikatory typu, które odnoszą się do typu klasy. Nie ma różnicy między używaniem "class" i "struct". –