すべてのコンストラクタが定義されたシンプルな構造体があります。 int変数を持ち、各コンストラクタと代入演算子は、* thisのアドレス、現在のint値、新しいint値を出力します。 割り当て演算子とコンストラクタを移動してコピーすると、渡された値のアドレスも出力されます。値渡しファンクションの追加移動コンストラクタ
#include <iostream>
struct X
{
int val;
void out(const std::string& s, int nv, const X* from = nullptr)
{
std::cout<<this<<"->"<<s<<": "<<val<<" ("<<nv<<")";
if (from)
std::cout<<", from: ["<<from<<"]";
std::cout<<"\n";
}
X(){out("simple ctor X()",0); val = 0;}
X(int v){out("int ctor X(int)", v);val = v; }
X(const X& x){out("copy ctor X(X&)", x.val, &x);val = x.val; };
X&operator = (const X& x){out("copy X::operator=()", x.val, &x); val = x.val; return *this;}
~X(){out("dtor ~X", 0);}
X&operator = (X&& x){out("move X::operator(&&)", x.val, &x); val = x.val; return *this;}
X(X&& x){out("move ctor X(&&x)", x.val, &x);val = x.val;}
};
X copy(X a){return a;}
int main(int argc, const char * argv[]) {
X loc{4};
X loc2;
std::cout<<"before copy\n";
loc2 = copy(loc);
std::cout<<"copy finish\n";
}
出力:
0xffdf7278->int ctor X(int): 134523184 (4) 0xffdf727c->simple ctor X(): 134514433 (0) before copy 0xffdf7280->copy ctor X(X&): 1433459488 (4), from: [0xffdf7278] 0xffdf7284->move ctor X(&&x): 1433437824 (4), from: [0xffdf7280] 0xffdf727c->move X::operator(&&): 0 (4), from: [0xffdf7284] 0xffdf7284->dtor ~X: 4 (0) 0xffdf7280->dtor ~X: 4 (0) copy finish 0xffdf727c->dtor ~X: 4 (0) 0xffdf7278->dtor ~X: 4 (0)
は(この例では)アドレス0xffdf7284で追加のオブジェクトを作成する目的は何ですか?
それで、適切な値を作成するために呼び出されますか? –
@ Guy-WithA-gum正確にはありません。それは価値がなく、すべてのメソッドに副作用があるので、それを移動してからデストラクタを呼び出します。これは、単に価値を全く伴わない。 –
なぜ "a"が返されないのですか?なぜ、それは構築値から移動する必要がありますか –