次のコードでは、2つの異なるメモリ位置を出力します。私は価値によって戻ってきているので、これは私にとって理にかなっています。
#include <iostream>
using namespace std;
class Foo {
public:
Foo () {}
// Foo (const Foo &) { cout << "Copy con" << endl; }
};
Foo test () {
Foo foo;
cout << &foo << endl;
return foo;
}
int main () {
Foo foo = test();
cout << &foo << endl;
}
ただし、上記のコードでコピーコンストラクターのコメントを解除して再度実行すると、同じメモリ位置が2回出力されます。なんで?「Copycon」はまったく出力されないので、コピーコンストラクターが呼び出されていないことがわかります。コピーコンストラクターが存在するだけで、呼び出されなくても、ある種の最適化が行われるようです。
GCC4.6.3で「g++-Walltest.cpp-otest」をコンパイルしています。