宣言時に初期化を行わないようにしたら、また動作が変わった。
#include <iostream> using namespace std; inline void debug(const char *s, long id) { cerr << s << ":" << id << endl; } class Foo { private: int i; public: Foo(int i) : i(i) { debug("Foo::Foo()", i); }; ~Foo() { debug("Foo::~Foo()", i); }; }; Foo func(Foo foo) { Foo foo2(2); debug("in func()", (long) &foo2); return foo2; } int main() { Foo foo1(1), foo2(0); foo2 = func(foo1); debug("out func()", (long) &foo2); return 0; }
g++
Foo::Foo():1
Foo::Foo():2
Foo::Foo():2
in func():2280608
Foo::~Foo():2
Foo::~Foo():1
out func():2280624
Foo::~Foo():2
Foo::~Foo():1
VC
g++ 3.xだと一時オブジェクトは作成されないらしい…
Foo::Foo():1
Foo::Foo():0
Foo::Foo():2
in func():1244724
Foo::~Foo():2
Foo::~Foo():1
Foo::~Foo():2
out func():1245000
Foo::~Foo():2
Foo::~Foo():1
ふむふむ。
追記
VCでも最適化を有効にしたら一時オブジェクトは作成されなかった。
Foo::Foo():1
Foo::Foo():0
Foo::Foo():2
in func():1245036
Foo::~Foo():1
Foo::~Foo():2
out func():1245032
Foo::~Foo():2
Foo::~Foo():1