現在、次のステートメントと混同しています-このステートメントはコンパイル時にエラーを生成しますが、そうではありません。
// statement 1:
someclass* q(someclass());
このような発言だったのなら分かる
// statement 2:
someclass* q(&someclass());
ステートメント1がエラーを生成しない理由、またはそれが有効である場合でも知りたいです(舞台裏で欠けているものはありますか?)
現在、次のステートメントと混同しています-このステートメントはコンパイル時にエラーを生成しますが、そうではありません。
// statement 1:
someclass* q(someclass());
このような発言だったのなら分かる
// statement 2:
someclass* q(&someclass());
ステートメント1がエラーを生成しない理由、またはそれが有効である場合でも知りたいです(舞台裏で欠けているものはありますか?)
ステートメント1がエラーを生成しない理由、またはそれが有効である場合でも知りたい
最初のステートメントは有効ですが、おそらく期待どおりに動作していません。このステートメントは、型のオブジェクトへのポインターを返し、引数を受け入れず、型のオブジェクトを返す関数を入力として受け取るという名前の関数を宣言しています。 . これは、Most Vexing Parseと呼ばれます。q
someclass
someclass
2 番目のステートメントは無効です。q
タイプ のオブジェクトを指す名前のポインターを宣言し、someclass
このポインターを式によって構築されたオブジェクトのアドレスに初期化しようとしていsomeclass()
ます。someclass()
ただし、これは一時的なものであり、一時的なアドレスを使用することは違法であることに注意してください。
ステートメント 1 は、実際には関数の宣言です。この関数は呼び出されq
、引数を取らず を返す関数へのポインタを取り、 へのsomeclass
ポインタを返しますsomeclass
。
最も厄介な解析を参照してください。