したがって、最初にコーディングします。
#include <iostream>
#include <utility>
struct X{
int i;
void transform(){}
X() :i(0){std::cout<<"default\n";}
X(const X& src): i(src.i){std::cout<<"copy\n";}
X(X&& msrc) :i(msrc.i){msrc.i=0;std::cout<<"move\n";}
};
X getTransform(const X& src){
X tx(src);
tx.transform();
return tx;
}
int main(){
X x1;// default
X x2(x1); // copy
X x3{std::move(X{})}; // default then move
X x41(getTransform(x2)); // copy in function ,then what?
X x42(std::move(getTransform(x2))); // copy in funciton, then move
X x51( (X()) );//default, then move? or copy?
// extra() for the most vexing problem
X x52(std::move(X())); //default then move
std::cout<<&x41<<"\t"<<&x51<<std::endl;
}
次に、C++11 機能をオンにして cygwin + gcc 4.8.2 から出力します。
default
copy
default
move
copy
copy
move
default
default
move
0x22aa70 0x22aa50
私がよく理解していないのは、x41 と x51 の行です。x41 の場合、関数呼び出しから返された一時的に移動コンストラクタまたはコピーを呼び出す必要がありますか? x51についても同じ質問です。
2 番目の質問は、出力を見ると、x41 と x51 の構成では、定義されたコンストラクターが呼び出されませんでしたが、オブジェクトはメモリ内に常駐しているため、明らかに作成されているということです。これはどうやってできるの?