C++03 のセクション 12.2.5 には、「コンストラクターの ctor-initializer (12.6.2) の参照メンバーへの一時的なバインドは、コンストラクターが終了するまで持続する」と書かれている
ので、次のプログラムを試しました。
#include<iostream>
using namespace std;
struct foo
{
foo()
{
cout<<"foo c'tor"<<endl;
}
~foo()
{
cout<<"foo d'tor"<<endl;
}
};
struct bar
{
const foo &ref;
bar():ref(foo())
{
cout<<"bar c'tor"<<endl;
}
};
int main()
{
bar obj;
}
私が得る出力は次のとおりです。
foo c'tor
foo d'tor
bar c'tor
現在、標準によれば、バーの c'tor の c'tor init-list で foo() によって一時的に生成されたものは、バーの c'tor の後に破棄されるため、後に出力するfoo d'tor
必要がありますbar c'tor
が、逆です。
理由を説明してください。