Временная привязка к константной ссылке в списке инициализаторов c'tor - PullRequest
12 голосов
/ 18 января 2011

Раздел 12.2.5 в C ++ 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 бара c'tor willбыть уничтоженным после c'or бара, поэтому foo d'tor должен быть напечатан после bar c'tor
, но все наоборот.
Пожалуйста, объясните причину.

1 Ответ

3 голосов
/ 18 января 2011

Я пробовал это с 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: ссылка должна быть инициализирована в списке инициализации конструктора.

...