12

C++03 のセクション 12.2.5 には、「コンストラクターの ctor-initializer (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

現在、標準によれば、バーの c'tor の c'tor init-list で foo() によって一時的に生成されたものは、バーの c'tor の後に破棄されるため、後に出力するfoo d'tor必要がありますbar c'tor
が、逆です。
理由を説明してください。

4

1 に答える 1

3

私はこれを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 は、コンストラクターの初期化リストで初期化する必要があります。

于 2011-01-18T09:32:05.307 に答える