2013-03-15 21 views
5

私は現在次のステートメントと混同していますが、このステートメントはコンパイル時にエラーを起こしますが、そうではありません。ポインタの初期化

// statement 1: 
someclass* q(someclass()); 

私は(文はこの

// statement 2: 
someclass* q(&someclass()); 

のようなものだった場合、私はなステートメント1 doesntのは、エラーが発生理由を知りたいのですか、それが有効である場合でも、理解し、私は舞台裏で行方不明です何があります?)

+0

最初の例で「ポインタ」を使用しようとしましたか? – molbdnilo

答えて

12

私はなステートメント1つのdoesntのは、エラーが発生理由を知りたいのですか、それが有効な

であったとしても、おそらくあなたが期待して何をしていないが、最初の文は、有効です。この文は、宣言されましたファンクションqという名前のオブジェクトへのポインタを返し、入力を受け取ると、引数を受け入れずにsomeclassのオブジェクトを返します。これはMost Vexing Parseと呼ばれます。

2番目のステートメントは有効ではありません:タイプsomeclassのオブジェクトへqという名前のポインタを宣言し、someclass()式で構築されたオブジェクトのアドレスにこのポインタを初期化しようとしています。ただし、someclass()の一時的なであり、一時的なアドレスの取得は違法です。

+2

このため、 '()'の代わりに '='演算子を使って初期化することをお勧めします。例えば'someclass * q = someclass();'は期待どおりにエラーを生成します。 – Lorkenpeist

+2

2番目のステートメントは無効です。あなたは*一時的なアドレスを取ることはできません。 –

+0

@BenjaminLindley:まあ、どうすればそれを見逃すことができます。ありがとうございます –

3

実際には、文1は関数の宣言です。この関数はqと呼ばれ、引数を取らずにsomeclassを返す関数へのポインタをとり、someclassへのポインタを返します。

Most Vexing Parseを参照してください。

関連する問題