9
struct my
{
   my(){ std::cout<<"Default";}
   my(const my& m){ std::cout<<"Copy";}
   ~my(){ std::cout<<"Destructor";}
};

int main()
{
   my m(); //1
   my n(my()); //2
}

期待される出力:

1 ) Default
2 ) Copy

実際の出力:


コンストラクター呼び出しメカニズムについての私の理解の何が問題になっていますか?

Note簡潔にするために、ヘッダー ファイルは省略しました。

4

2 に答える 2

11

ケース 1)

m関数の戻り値として解釈され、my引数を取りません。期待される出力を確認するには、削除します。()つまり、使用しますmy m;

ケース 2)

これは、「最も厄介な解析」としてよく知られているものです。

nmyは、引数を取らない関数を返す関数へのポインタ型の引数を取る関数戻りとして解釈されmyます。

この場合に期待される出力を確認するには、my n((my()));[前の場合のように引数指定として扱う代わりに、余分なため、コンパイラはそれを式として解釈する()]を試してください。

私の解釈:

my n((my()))と同等my n = my()です。現在、右辺値式my()は一時的な [つまり、デフォルトのコンストラクターへの呼び出し] を作成し、その一時オブジェクトにコピー初期化されます [コンパイラーの最適化nのため、copy-ctor への呼び出しはありません]。

PS : 回答の最後の部分については 100% 確信が持てません。私が間違っている場合は修正してください。

于 2010-11-26T08:24:52.843 に答える
1

Prasoon のように、C++ コンパイラが予期しない方法でコードを解析しているのではないかと思います。たとえば、行を解析していると思います

my m();

変数宣言やコンストラクターへの呼び出しとしてではなく、関数プロトタイプ宣言として-したがって、出力が表示されない理由。

于 2010-11-26T09:18:50.647 に答える