2016-12-06 13 views
1

それは変数mを宣言しないようデフォルトのコンストラクタの好奇心

MyClass m(); 

は、古典的な落とし穴ですが、関数はゼロの引数を取り、MyClassのを戻しながら。しかし、私は(何らかの形で上記の文にcolapsesらしい)のVisual Studioで次のステートメントは、同じ問題を生成することが見つかりました:

MyClass m(MyClass()); 

誰もが、この動作を説明できますか?

注:期待されるもののより明示的なバージョンは正しいことを行います(つまり、デフォルトを呼び出し、次に移動コンストラクタを呼び出します)。

MyClass m(std::move(MyClass())); 

答えて

4

それはほとんどの難問の解析問題があります。

MyClass m(MyClass()); 

このラインはタイプMyClassののオブジェクトを返すと、引数なしと型MyClassのの戻り値を持つ関数へのポインタである単一の引数を受け入れるメートルという名前の関数のように解析されます。ここで

MyClass m(std::move(MyClass())); 

のstd ::動きは期待通りのラインを解析するために、コンパイラのに役立ちます。

3

はい、これは古典的なMost Vexing Parseです。関数のように見えるものは、それが他のものであっても関数です。

は、適切な変数定義にこれを変換するには、いくつかの従来の方法がありますが、最良のものは、均一な初期化を使用することです:

MyClass m{MyClass()}; 

(上記の例では、冗長であるという事実と、より良い例だろうにもかかわらずタイプが異なる場合は、A m{B()};など)

関連する問題