質問

C ++ 03のセクション12.2.5が言っている」コンストラクターのCTORイニタライザー(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

Standardによれば、Bar'sC'Torの後にc'torのinit-listでfoo()によって生成された一時的な生成は、barの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は、Constructorの初期化リストで初期化する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top