2012-03-20 15 views
3

宣言することはできません。私は匿名オブジェクトは、このコードがある

SomeClass(a); 

を書くことが一つの引数で匿名オブジェクトを作成する方法

SomeClass a; 

と同じであると仮定しますか?

+0

@BoBTFish:いいえ。彼は機能的なキャスト構文を使って一時的なオブジェクトを作成しています。あなたはコンストラクタを直接呼び出すことはありません。実際に投稿したコードでさえ、実際には –

+0

という[AnonymousClass(変数)宣言で実際に何が起こっているのですか?](http://stackoverflow.com/questions/6341951/whats-actually-going-on-in-この無名クラス変数宣言) – Nawaz

答えて

3

次のようなもので、独自の声明の中で、一時的なオブジェクトを構築することができます:あなたが観察してきたように、括弧を解決するために必要な

(SomeClass)a; 

または

(SomeClass(a)); 

宣言と式文のあいまいさ。

0

あなたの前提は正しいです。

単一のコンストラクタ引数を使用して、同じステートメントが宣言である可能性のあるコンテキスト内に一時オブジェクトを作成することはできません。文法によってあいまいになります(または、表示される動作が優先されるように定義されていない場合は、は曖昧になります)。

なぜオブジェクトに名前を付けないのですか?

SomeClass obj(a); 

それとも、あなたはオブジェクトが(時々これは便利です。例えばboost::this_thread::interruption_point、それは引数を取りませんが)、すぐに破棄したい理由がある場合、あなたはまだ仮のが、デambiguateを作成することができます声明:あなたはまた、Cスタイルを使用することができる可能性がいくつかのシナリオで

(SomeClass(a)); // the parens prevent this from being a declarative statement 

はキャスト:

(SomeClass)a; 

しかし、うまくいけば、あなたのSomeClassコンstructorは実際にはexplicitとマークされており、とにかくCスタイルのキャストを使用しない方が望ましいです。

この問題は、他のコンテキストでは、一時的には、とにかく多くの意味をなさない可能性のあるものを生じない:あなたは、次のように、そのanonymouseオブジェクトを作成することができ

std::cout << SomeClass(a); // *can't* be a decl of a `SomeClass` called `a` 
+2

"オブジェクトが破壊されたときに変更しないのはなぜですか?" ; -p –

+0

@SteveJessop:Pfft:P –

2

を:

(SomeClass(a)); 

これをaという宣言はできないので、あいまいさを解決します。

(SomeClass a); // Error: this can't be a declaration because of the parentheses 
       //  but what else should it be? 
1

一般的に、書いたのと同じ効果を持つコードを書くことで最も厄介な構文解析を避けることができますが、宣言として解析することはできません。

これは、しばしばかっこを追加することによって行われます。(SomeClass(a));を行います。この場合

、またはその文脈において(void) SomeClass(a);

2

、ブレースは

SomeClass(a); //declaration of a 

が再び等価である

SomeClass a; //declaration of a 

と正確に等価である意味し、余分ですこれらには:

SomeClass((a)));  //declaration of a 
SomeClass(((a)));  //declaration of a 
SomeClass((((a)))); //declaration of a 
SomeClass(((((a))))); //declaration of a 

これらはすべて、名前がaで、タイプがSomeClassであることを宣言しています。

関連する問題