私はこのコードを書きました:
struct X{
int val;
void out(const string& s, int nv)
{cerr<<this<<"->"<<s<<": "<<val<<"("<<nv<<")\n";}
X() {out("X(int)",0); val=0;}
X(int v){out("X(int)",v); val=v;}
X(const X& x){out("X(X&)",x.val); val=x.val;}
X& operator=(const X& a)
{out("X::operator=()",a.val); val=a.val; return *this;}
~X() {out("~X()",0);}
};
X copy(X a) {return a;}
int main{
X loc2;
X loc(5);
loc2 = copy(loc);
return 0;
}
出力はこれです(VS2010で):
003BFAA0->X(int): -858993460(0)
003BFA94->X(int): -858993460(5)
003BF964->X(X&): 723486321(5)
003BF994->X(X&): -858993460(5)
003BF964->~X(): 5(0)
003BFAA0->X::operator=(): 0(5)
003BF994->~X(): 5(0)
最初の 2 行は問題ありません。しかし、3 行目と 4 行目は、X(X&) を 2 回呼び出していることを示しています。copy(X a) には「X a」が 1 つだけ含まれています。X(X&) が 2 回呼び出されるのはなぜですか?