5

現在、次のステートメントと混同しています-このステートメントはコンパイル時にエラーを生成しますが、そうではありません。

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

このような発言だったのなら分かる

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

ステートメント1がエラーを生成しない理由、またはそれが有効である場合でも知りたいです(舞台裏で欠けているものはありますか?)

4

2 に答える 2

12

ステートメント1がエラーを生成しない理由、またはそれが有効である場合でも知りたい

最初のステートメントは有効ですが、おそらく期待どおりに動作していません。このステートメントは、型のオブジェクトへのポインターを返し、引数を受け入れず、型のオブジェクトを返す関数を入力として受け取るという名前の関数を宣言しています。 . これは、Most Vexing Parseと呼ばれます。qsomeclasssomeclass

2 番目のステートメントは無効です。qタイプ のオブジェクトを指す名前のポインターを宣言し、someclassこのポインターを式によって構築されたオブジェクトのアドレスに初期化しようとしていsomeclass()ます。someclass()ただし、これは一時的なものであり、一時的なアドレスを使用することは違法であることに注意してください。

于 2013-03-15T22:59:40.910 に答える
3

ステートメント 1 は、実際には関数の宣言です。この関数は呼び出されq、引数を取らず を返す関数へのポインタを取り、 へのsomeclassポインタを返しますsomeclass

最も厄介な解析を参照してください。

于 2013-03-15T22:59:33.920 に答える