C++11
move コンストラクターの使用に問題があります。という単純なコンテナ クラスがありNumber
、その唯一のデータ メンバは整数です。次のコードがあります。
//Number.h
#ifndef NUMBER_H
#define NUMBER_H
#include <iostream>
class Number
{
public:
Number();
Number(int ipar);
Number(const Number& src);
Number(Number&& src);
private:
int num;
};
#endif
と
//Number.cpp
#include "Number.h"
Number::Number()
{
std::cout << "default ctor" << std::endl;
}
Number::Number(int ipar) : num(ipar)
{
std::cout << "integer argument ctor" << std::endl;
}
Number::Number(const Number& src) : num(src.num)
{
std::cout << "copy ctor" << std::endl;
}
Number::Number(Number&& src) : num(src.num)
{
std::cout << "move ctor" << std::endl;
}
と
//main.cpp
#include "Number.h"
using namespace std;
int main()
{
cout << "Part A:" << endl;
Number n1(1);
cout << "Part B:" << endl;
Number n2(n1);
cout << "Part C:" << endl;
Number n3{Number{n1}};
cout << "Part D:" << endl;
Number n4(Number(n1));
return 0;
}
これは以下を出力します:
Part A:
integer argument ctor
Part B:
copy ctor
Part C:
copy ctor
Part D:
パート D の出力がないことに注意してください。パート A と B の出力は期待どおりですが、その他の出力はそうではありません。
パート C と D でこれを期待していました。
Part C:
copy ctor
move ctor
Part D:
copy ctor
move ctor
パート C の期待:
Number{n1}
の部分はNumber n3{Number{n1}}
一時的な名前のないNumber
オブジェクトを作成することを期待していNumber
ましたn1
。Number n3
次に、一時オブジェクトを使用して移動コンストラクターを呼び出すことで構築されることを期待していました。
パートDへの期待:
これはパート C に似ていますが、中括弧の代わりに括弧が使用されている点を除けば、このパートがパート C と同じように動作し、出力されることを期待していました。
質問:
実際の出力が期待と異なるのはなぜですか? また、目的の出力を得る正しい方法は何ですか?
注:これを Visual Studio でコンパイルする場合は、統一された初期化構文をサポートするために、Visual Studio 2012 用のVisual C++ コンパイラ 2012 年 11 月 CTP以降が必要です。