Привязка временного к 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
но это наоборот.
Пожалуйста, объясните причину.
Ответы
Ответ 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 должен быть инициализирован в списке инициализации конструктора.