Привязка временной для константной ссылки в списке инициализаторов C'TOR

StackOverflow https://stackoverflow.com/questions/4721136

Вопрос

Раздел 12.2.5 в C ++ 03 говорит "Временная связь с эталонным элементом в 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;
}    

Вывод, который я получаю, является:

foo c'tor
foo d'tor
bar c'tor

Теперь, согласно стандарту, временно, сгенерированный Foo () в C'tor init-list из бара C'TOR, будет уничтожен после CTOR BAR, так что 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 должен быть инициализирован в списке инициализации Constructor.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top