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
现在根据标准,在bar'c'tor的c'tor init-list中由foo()生成的临时值将在bar'c'tor之后被销毁,因此foo d'tor
之后应该打印bar c'tor
<登记/>
但它是相反的。
请解释原因。
答案 0 :(得分:3)
我在MS VS 2010中试过这个,它给了我输出也在编译时发出警告:
警告C4413:'bar :: ref':引用成员初始化为在构造函数退出后不会保留的临时成员
foo c'tor
bar c'tor
foo d'tor
Press any key to continue . . .
似乎MS VS 2010正确实现了规范。我同意这是g ++的错误。
编辑:ref应该在构造函数的初始化列表中初始化。