g++-4.8.1 では、一時変数がクラスのインスタンスにバインドされている場合、以下の 2 つのサンプルで異なる動作が発生することがわかりました。
template <class T>
struct A
{
A(T const& a) : b(a) { }
T const& b;
};
と
template <class T>
struct B
{
B(T const& a) : b{a} { }
T const& b;
}
最初のサンプルでは、バインドされた一時オブジェクトが A のインスタンスの存続期間中存続することがわかりましたが、これは B のインスタンスには当てはまりません。そのような動作は C++11 標準に従って正しいですか? 規格の関連部分を指摘してください。
注:
A
とB
、およびそれらがバインドする一時オブジェクトは、式でインスタンス化されます。式の終わりに、それらはバインド先のテンポラリーと共に破棄されます。そのため、それらのライフタイムはテンポラリーのライフタイムと同じである必要があります。
編集:標準のこの部分は、2つの初期化間の不一致を説明できますか:
— それ以外の場合、T が参照型の場合、T によって参照される型の一時的な prvalue はリスト初期化され、参照はその一時的なものにバインドされます。[ 注: いつものように、参照型が非 const 型への左辺値参照である場合、バインディングは失敗し、プログラムは不正な形式になります。— エンドノート]