2013-01-16 14 views
8

Sto guardando un codice legacy e ho trovato x=new(Foo); (nota la parentesi attorno al tipo fornito). Ho provato le varianti e sembra essere lo stesso di x=new Foo;"x = new (Foo)" è uguale a "x = new Foo" per un Foo arbitrario?

Foo è una struttura dati non POD. Qualche programma di perdita di memoria esterna sta segnalando la linea - sta allocando memoria per un parametro di uscita CORBA, quindi il chiamante dovrebbe occuparsi dell'eliminazione, ma questo è un problema separato con molti livelli di riferimento indiretto.

La mia analisi è corretta ed è accettabile?

risposta

5

Se il nome del tipo ha parentesi deve essere racchiuso tra parentesi. Altri tipi possono essere inclusi.

Esempio dove sono richieste parentesi:

new int(*[10])(); // parser error: parsed as (new int) (*[10])() 
new (int (*[10])()); // OK: allocates an array of 10 pointers to functions 

Da cppreference.com: new expression

10

È corretto, ma lo stile è almeno inusuale.

Le parentesi intorno a un nome di tipo completo sono talvolta consentite, ma in questo caso sono estranee. È come mettere le parentesi su un'espressione dove non è necessario. Forse la più stretta analogia sarebbe

return(0); /* looks like a function, but isn't */ 

Confusamente, le parentesi sono necessarie per l'operatore sizeof, quando si passa un nome di tipo ma non quando esso passa un'espressione. Personalmente la vedo come un'incongruenza e non sceglierei di diffonderla nel resto della lingua.

+4

Questo è quello che ho pensato troppo, ma si scopre che deve essere più sottile di quello. Ad esempio, il seguente codice non viene compilato: '(int) main() {return 0; } '. –

+3

Non è vero, le parentesi intorno ai tipi non sono generalmente consentite. – zch

+2

@zch Quindi, c'è un breve elenco di parentesi * quando * sono in arrivo? –

Problemi correlati