Подтвердить что ты не робот

Привязка временного к const-ссылке в списке инициализаторов c'tor

В разделе 12.2.5 на С++ 03 говорится: " Временная привязка к ссылочному элементу в конструкторы 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

Теперь, согласно стандарту, временный, сгенерированный foo() в c'tor init-list bar c'tor, будет уничтожен после строки c'tor, поэтому foo d'tor следует напечатать после bar c'tor
но это наоборот.
Пожалуйста, объясните причину.

4b9b3361

Ответ 1

Я пробовал это с MS VS 2010, и он дает мне вывод, также дает предупреждение во время компиляции:

предупреждение C4413: "bar:: ref": элемент ссылки инициализируется временным, который не сохраняется после выхода конструктора

foo c'tor
bar c'tor
foo d'tor
Press any key to continue . . .

Кажется, что MS VS 2010 правильно реализует спецификацию. Я согласен, что это ошибка для g++.

EDIT: ref должен быть инициализирован в списке инициализации конструктора.