문제

Section 12.2.5 in C++03 says "A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits"
So I tried following program

#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;
}    

The output I get is :

foo c'tor
foo d'tor
bar c'tor

Now according to standard, temporary generated by foo() in c'tor init-list of bar's c'tor will be destroyed after bar's c'tor so foo d'tor should be printed after bar c'tor
but it's other way around.
Please explain the reason.

도움이 되었습니까?

해결책

I have tried this with MS VS 2010, and it gives me the output also gives warning during compile:

warning C4413: 'bar::ref' : reference member is initialized to a temporary that doesn't persist after the constructor exits

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

It seems that MS VS 2010 implements specification correctly. I agree that it is a bug for g++.

EDIT: ref should be initialized in constructor`s initialize list.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top