続・コピーコンストラクター

#include 
using namespace std;

class A {
public:
    A() {
        cout << "A::A()" << endl;
    }
    A(const A& a) {
        cout << "A::A(const A&)" << endl;
    }
    virtual ~A() {
        cout << "A::~A()" << endl;
    }
};

A foo() {
    cout << "b" << endl;
    A a;
    cout << "c" << endl;
    return a;
}

void main() {
    cout << "a" << endl;
    foo(); // 戻り値を見ないことにしてみた。
    cout << "d" << endl;
}

の実行結果は、

a
b
A::A()
c
A::A(const A&)
A::~A()
A::~A()
d

となる。これを見ると、関数 foo の return で戻り値を返す時点でもうコピーコンストラクターが呼ばれているような感じだ。foo を呼ぶ側で A a = foo(); のように受けようと、foo(); のように戻り値を無視しようと、コピーコンストラクターは呼ばれてしまう。なお、戻り値を無視すると、foo() が返したインスタンスのスコープはすぐに終わるため、デストラクターも早い段階("d" を cout するより以前)で呼ばれているようだ。