Привязка временной для константной ссылки в списке инициализаторов C'TOR
-
12-10-2019 - |
Вопрос
Раздел 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.