Временная привязка к константной ссылке в списке инициализаторов c'tor
Раздел 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'or init-списке c'or бара будет уничтожено после c'or бара, так что foo d'tor
должен быть напечатан после bar c'tor
но это наоборот.
Пожалуйста, объясните причину.
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++.
РЕДАКТИРОВАТЬ: ref должен быть инициализирован в списке инициализации конструктора.