2011-01-18 14 views
12

C++ 03の12.2.5節では、 ""コンストラクタが終了するまで、 コンストラクタのctor-initializer(12.6.2)内の参照メンバへの一時バインドが続きます。は「
は、だから私は、次のプログラムc'torイニシャライザリストのconst参照への一時バインディング

#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(によって生成された一時的な)c'tor iniファイルでバーの番号のリストはバーの後に破棄されるのでfoo d'torbar c'tor
の後に印刷する必要がありますが、それは逆です。
理由を説明してください。

+1

コンストラクタ内で 'ref'を参照するとどうなりますか?おそらく実際には使用されていないので、コンパイラは以前にそれを破壊する可能性があると判断します。 –

+2

VS2008は 'foo、bar、foo'出力を生成します。ここでgcc 4.3.4は' foo、foo、bar'出力を生成します。面白い... – Naveen

+12

g ++バグ、レポート。 –

答えて

3

私はMS VS 2010でこれを試してみましたが、それは私に与え出力も、コンパイル時に警告を与える:

警告C4413

:「バー:: refは」:基準部材は、「doesnのその一時的に初期化されますコンストラクタは、MS VS 2010が正しく仕様を実装しているようです

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

出た後のtが持続します。私はそれがg ++のバグであることに同意します。

EDIT:refは、コンストラクタの初期化リストで初期化する必要があります。