在c'tor初始化列表中将临时绑定到const引用

时间:2011-01-18 06:31:06

标签: c++ const-reference temporaries

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 <登记/> 但它是相反的。
请解释原因。

1 个答案:

答案 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应该在构造函数的初始化列表中初始化。