C++ 在c'中绑定临时常量引用;tor初始值设定项列表

C++ 在c'中绑定临时常量引用;tor初始值设定项列表,c++,const-reference,temporaries,C++,Const Reference,Temporaries,C++03中的第12.2.5节说“临时绑定到 构造函数的ctor初始值设定项(12.6.2)持续存在,直到构造函数退出“ 所以我试着遵循这个程序 #include<iostream> using namespace std; struct foo { foo() { cout<<"foo c'tor"<<endl; } ~foo() { cout<<"foo d'tor"<<endl; } };

C++03中的第12.2.5节说“临时绑定到 构造函数的ctor初始值设定项(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;
}    
现在根据标准,bar c'tor的c'tor init列表中由foo()生成的临时文件将在bar c'tor后销毁,因此
foo d'tor
应在
bar c'tor
后打印
但情况正好相反。

请解释原因。

我已经在MS VS 2010上尝试过了,它给了我输出并在编译过程中给出了警告:

警告C4413:'bar::ref':引用成员被初始化为临时成员,在构造函数退出后不会持久化

foo c'tor
bar c'tor
foo d'tor
Press any key to continue . . .
看起来MS VS 2010正确地实现了规范。我同意这是g++的一个bug


编辑:应在构造函数的初始化列表中初始化ref。

如果在构造函数中引用“ref”,会发生什么?可能编译器决定,因为它没有实际使用,所以可以更早地销毁它。VS2008生成
foo,bar,foo
输出,其中gcc 4.3.4生成
foo,foo,bar
输出。有趣的…g++错误,报告。@Tal Pressman:是的,我也试过了:只是为了提供信息:在MS VS warning C4413中:“bar::ref”:引用成员被初始化为临时成员,在构造函数退出后不会持久存在
foo c'tor
bar c'tor
foo d'tor
Press any key to continue . . .