2013-07-19 12 views
9

Sono rimasto stupito quando ho visto che questo codice di successo è stato compilato con MS Visual C++.Stringa di parole chiave prima del nome del costruttore

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

Cosa significa parola chiave struct in tale contesto di strano?

+0

Non mi compila con G ++ 4.8. Ma il compilatore MS vs2010 lo accetta. Puzza di strano bug parse. Che compilatore stai usando? – SteveLove

+0

[tag: Visual-C++], compilatore MS. Scusate, devo scriverlo a lezione. –

+0

Perché i downvotes? La domanda è corretta e in effetti compila in VC++ (almeno VC++ 2010) senza avvisi. Non sapere la risposta non è una ragione per il downvote. Che ciò vada contro lo standard non è né l'uno né l'altro. – Gorpik

risposta

10

Nella maggior parte dei contesti, è possibile utilizzare il tipo elaborato specificatorestruct foo, o equivalentemente class foo, anziché solo il nome della classe foo. Questo può essere utile per risolvere le ambiguità:

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 

Tuttavia, non è possibile utilizzare questo modulo quando si dichiara un costruttore, in modo che il compilatore è sbagliato ad accettare che il codice. La specifica per una dichiarazione del costruttore (in C++ 11 12.1/1) consente solo il nome della classe stessa, non un identificatore di tipo elaborato.

In generale, non dovresti essere sorpreso quando Visual C++ compila tutti i tipi di codice instabile. È noto per le sue estensioni non standard alla lingua.

+0

C'è un'altra aggiunta: la classe ha come valore predefinito l'ereditarietà privata mentre struct è impostata come predefinita. –

+5

@ IanM_Matrix1: Questa è la differenza tra l'uso di 'class' e' struct' in una definizione di classe; ma non stiamo parlando delle definizioni di classe qui, basta digitare gli specificatori usati per riferirsi al tipo di classe. Non c'è differenza tra l'uso di 'class' e' struct' lì. –

Problemi correlati