2014-05-05 9 views
9

che sto considerando un esempio dal spec ufficiale:Come è la classe A * A; dichiarazione analizzata da C++?

class A * A; 

Ho letto che questa linea introduce i due nomi: class A cui si può accedere tramite elaborato-specificatore di tipo solo ed puntatore ad A. E ' questa linea è completamente equivalente alle due linee seguenti?

class A; 
A * A; 

è che la linea appena lo zucchero sintassi e in realtà abbiamo due linee come ho sopra specificato? O come è analizzato il class A * A; dal compilatore?

+0

cosa fa una linea A * A, non ha senso –

+2

@TejasPatel dichiara una variabile 'A' di tipo' A * '. –

+0

@LuchianGrigore Nel secondo esempio, non chiamerebbe un operatore * se esiste? –

risposta

9

Sì, la dichiarazione in linea è solo zucchero sintattico. Stai pronunciando in avanti il ​​nome e usandolo sulla stessa linea.

+0

Grazie per la risposta. Ma sto cercando di trovarne un po 'nelle specifiche. Puoi darmi un riferimento? –

+1

inoltre, il fatto che tu _can_ dichiari una variabile con lo stesso nome (caso e tutto) come una classe non significa che devi farlo _should_. : D – Massa

+0

Non capisco perché questa riga sia valida in C++. Puoi darmi un riferimento? –

8

sto cercando risposta più dettagliata nella bozza di lavoro N3797 e ho trovato il seguente:

§8.3.3:

Così, una dichiarazione di un particolare identificativo ha il modulo T D dove T ha il formato attribute-specifier-seq_*opt* decl-specifier-seq e D è un dichiaratore.

§7.1:

decl-specifier: 
    storage-class-specifier 
    type-specifier 
    function-specifier 
    friend 
    typedef 
    constexpr 
decl-specifier-seq: 
    decl-specifier attribute-specifier-seq_*opt* 
    decl-specifier decl-specifier-seq 

§7.1.6:

type-specifier: 
    trailing-type-specifier 
    class-specifier 
    enum-specifier 

§8.3.1:

In una dichiarazione T D dove D ha la forma * attribute-specifier-seq_*opt* cv-qualifier-seq_*opt* D1 e il tipo di identificatore nella dichiarazione T D1 è “derivata dichiaratore-tipo-list T”, quindi il tipo di identificatore di D è “-dichiaratore-tipo derivato -list cv-qualificatore-ss puntatore T.”

Ora class-specifier contiene class parola chiave all'interno. Quindi class A * A è una grammatica valida, dove * A è dichiaratore.

Problemi correlati