开发者

Binding temporary to const reference in c'tor initializer list

开发者 https://www.devze.com 2023-02-05 09:53 出处:网络
Section 12.2.5 in C++03 says \"A temporary boun开发者_如何学Pythond to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits\"

Section 12.2.5 in C++03 says "A temporary boun开发者_如何学Pythond 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.

0

精彩评论

暂无评论...
验证码 换一张
取 消