2013-01-16 14 views
8

Przyglądam się starszemu kodowi i natknęłam się na x=new(Foo); (zwróć uwagę na nawiasy wokół podanego typu). Przetestowałem różne warianty i wydaje się być taki sam, jak x=new Foo;Czy "x = new (Foo)" jest takie samo jak "x = new Foo" dla dowolnego Foo?

Foo jest strukturą danych innych niż POD. Jakiś program wycieku pamięci zewnętrznej sygnalizuje linię - alokuje pamięć dla parametru wyjściowego CORBA, więc wywołujący powinien dbać o usunięcie, ale jest to oddzielny problem z wieloma warstwami pośrednimi.

Czy moja analiza jest poprawna i czy jest do przyjęcia?

Odpowiedz

5

Jeśli nazwa typu ma nawiasy, musi być ujęta w nawiasy. Inne typy mogą być również zamknięte.

Przykład gdzie wymagane są nawiasy:

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

Od cppreference.com: new expression

10

To prawda, ale styl jest co najmniej nietypowy.

Nawiasy wokół pełnej nazwy typu są czasami dozwolone, ale w tym przypadku są nieistotne. To jak umieszczanie nawiasów wokół wyrażenia, które nie są potrzebne. Być może najbliższa analogia byłaby

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

Confusingly, że nawiasy są wymagane dla operatora sizeof, gdy przekazując mu nazwę typu, ale nie wtedy, gdy przekazując jej wyrażenia. Osobiście widzę to jako niespójność i nie zdecyduję się na rozpowszechnienie jej w pozostałej części języka.

+4

To co myślałem też, ale okazuje się, że to musi być bardziej subtelne niż to. Na przykład następujący kod nie jest kompilowany: '(int) main() {return 0; } '. –

+3

Nieprawdziwe, nawiasy wokół typów nie są zwykle dozwolone. – zch

+2

@zch Następnie, czy istnieje (bez odniesienia dudnienie, choć wyczuwam to nadchodzi) krótka lista, kiedy nawias * są * dozwolone wokół typów? –

Powiązane problemy