2011-01-18 13 views
7

Recentemente ho trovato questo costrutto: int (m); che sembra essere equivalente a: int m;sintassi decimale variabile C++

Stranamente, non ho mai visto questo particolare idioma prima. Qualcuno può indicarmi un riferimento dove posso leggere le specifiche su questo, o semplicemente spiegare direttamente? Funziona anche in C dritto?

Grazie, ConfusedDeveloper

+3

Mentre questa è la sintassi perfettamente legale per la dichiarazione di un numero intero, per il piacere dei tuoi colleghi sviluppatori lo cambia in 'int m;'. –

risposta

11

Non è un "linguaggio". È solo una coppia ridondante di parentesi. Grammaticamente, possono essere lì, ma non servono a nulla.

volte simili parentesi apparentemente superflue possono essere usate per risolvere l'ambiguità di dichiarazioni C++, come

int a(int()); 

che dichiara una funzione può essere trasformato in

int a((int())); 

che equivale a

int a = int(); 

e definisce una variabile. Ma questo non è esattamente quello che hai nel tuo caso.

+2

Minor nitpick: non è sempre ridondante. Ad esempio, puoi scrivere 'cout << int (n)', ma non 'cout << int n'. – suszterpatt

+0

Grazie, è utile. BTW, definizione di idioma: un'espressione sancita dall'uso che è peculiare di un linguaggio. Sembra una descrizione appropriata. – ConfusedDeveloper

+7

@suszterpatt: la domanda riguardava specificamente le dichiarazioni. Il tuo esempio non comporta alcuna dichiarazione. Il tuo esempio riguarda '()' nelle espressioni, che è una storia completamente diversa. – AnT

1

Viene anche utilizzato per il cast. Mi piace,

double m= 10.0; 
int n= int(m); 
+0

La domanda riguarda le dichiarazioni, e questa non è affatto una dichiarazione, solo qualcosa che sembra simile. – aschepler

+2

@aschepler: Sì. Dal momento che sembra simile, è per questo che lo post. Volevo solo dirgli che questo è anche il modo in cui viene utilizzato. :-) – Nawaz

1

In aggiunta alle altre risposte, a volte il dichiaratore deve essere tra parentesi.
Ad esempio:

struct A {}; 

struct B { A a; }; 

namespace N { 
    struct B { int a; }; 

    void f() 
    { 
    A (::B::*p) = &::B::a; // this() cannot be omitted 
    } 
} 

Se () viene omesso nel codice precedente, compilatore riconosce un consecutivo nidificata nome specificatore A::B anziché A e ::B, ed emetterà un errore.
Questa parentesi è necessaria, ma a volte conduce a una situazione fuorviante.

struct A { 
    int m; 
    A() {} 
    A(int) {} // this isn't called 
}; 

int i; 

int main() 
{ 
    A(i); // this is a declaration 
    i.m = 1; // ok 
} 

Nel codice precedente, A(i) è una dichiarazione (e anche una definizione in questo caso) di un oggetto i, anziché un'espressione chiamata costruttore con un int argomento i.

Spero che questo aiuti.