第12.2.5节在C ++ 03中说“在构造函数ctor-Inializer(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()在Bar's C'tor的C'tor Init-list中生成的临时性将在Bar's C'tor之后被销毁 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应在构造函数的初始化列表中初始化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top