2011-01-18 14 views
12

Раздел 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
, но все наоборот.
Пожалуйста, объясните причину.

+1

Что произойдет, если вы ссылаетесь на 'ref' внутри конструктора? Возможно, компилятор решает, что, поскольку он фактически не используется, он может уничтожить его раньше. –

+2

VS2008 создает выход 'foo, bar, foo', где gcc 4.3.4 создает выход' foo, foo, bar'. Интересно ... – Naveen

+12

g ++ ошибка, отчет. –

ответ

3

Я попытался это с MS VS 2010, и это дает мне выход также дает предупреждение во время компиляции:

предупреждение C4413: «бар :: исх»: контрольный элемент инициализируется временный, что Безразлично» т сохраняются после того, как конструктор выходит

foo c'tor 
bar c'tor 
foo d'tor 
Press any key to continue . . . 

кажется, что MS VS 2010 реализует спецификацию правильно. Я согласен, что это ошибка для g ++.

EDIT: ref должен быть инициализирован в списке инициализации конструктора.