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

Hap*_*tal 12 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;
}    
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

foo c'tor
foo d'tor
bar c'tor
Run Code Online (Sandbox Code Playgroud)

现在根据标准,在条形码c'tor的c'tor init-list中由foo()生成的临时性将在bar'c'tor之后被销毁,所以foo d'tor应该在之后打印,bar c'tor
但它是相反的.
请解释原因.

bar*_*noz 3

我已经用 MS VS 2010 尝试过这个,它给我输出,并且在编译过程中给出警告:

警告 C4413:“bar::ref”:引用成员被初始化为临时成员,该临时成员在构造函数退出后不会保留

foo c'tor
bar c'tor
foo d'tor
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

看来 MS VS 2010 正确实现了规范。我同意这是 g++ 的一个错误。

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