Раздел 12.2.5 на C++ 03 говорит: «Временная привязка к ссылочному элементу в ctor-инициализаторе конструктора (12.6.2) сохраняется до тех пор, пока конструктор не выйдет "
Так что я попробовал следующую программупривязка временного значения к const в списке инициализаторов c'tor
#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 INI t-лист бара c'tor будет уничтожен после бара c'tor, поэтому foo d'tor
следует напечатать после bar c'tor
, но все наоборот.
Пожалуйста, объясните причину.
Что произойдет, если вы ссылаетесь на 'ref' внутри конструктора? Возможно, компилятор решает, что, поскольку он фактически не используется, он может уничтожить его раньше. –
VS2008 создает выход 'foo, bar, foo', где gcc 4.3.4 создает выход' foo, foo, bar'. Интересно ... – Naveen
g ++ ошибка, отчет. –