2013-01-16 11 views
8

私はいくつかのレガシーコードを見て、x=new(Foo);(付属の型の周りのかっこに注意してください)に出くわしました。私はバリエーションをテストしました。x=new Foo;"x = new(Foo)"は任意のFooに対して "x = new Foo"と同じですか?

Fooは非PODデータ構造です。いくつかの外部メモリリークプログラムがラインにフラグを立てています。呼び出し側が削除を処理する必要があるように、CORBA出力パラメータ用にメモリを割り当てていますが、それは多くの間接レイヤーとは別の問題です。

私の分析は正しいですか?

答えて

5

型の名前にかっこがある場合は、かっこで囲む必要があります。他のタイプも同様に囲むことができます。括弧が必要とされている

例:

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

cppreference.com: new expression

10

これは正しいですが、スタイルは少なくとも珍しいです。

完全な型名のまわりのかっこは時々許されますが、この場合は無関係です。これは、必要のない式の周りにかっこを置くようなものです。それを表現を渡すときにそれをタイプ名を渡すではなく、ときおそらく最も近いアナロジーは、紛らわしいことに、括弧はsizeofオペレータのために必要とされる

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

だろう。個人的に私はそれを矛盾として見て、それを他の言語にも広げようとはしません。

+4

から私も考えたものだが、それはそれはそれよりもっと微妙でなければならないことが判明。たとえば、次のコードはコンパイルされません。 '(int)main(){return 0; } '。 –

+3

実際には、型の周りのカッコは使用できません。 – zch

+2

@zchそれでは、括弧*が型の周りに許されているかどうかの短いリストがあります。 –

関連する問題