c – 在初始化器列表中临时绑定到const引用

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’s c’tor的c’tor init-list中的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的错误.

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

翻译自:https://stackoverflow.com/questions/4721136/binding-temporary-to-const-reference-in-ctor-initializer-list

转载注明原文:c – 在初始化器列表中临时绑定到const引用