C'TOR初期化リストのCONSTリファレンスに一時的なバインディング
-
12-10-2019 - |
質問
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の初期化リストで初期化する必要があります。
所属していません StackOverflow