2

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 標準に従って正しいですか? 規格の関連部分を指摘してください。

注: AB、およびそれらがバインドする一時オブジェクトは、式でインスタンス化されます。式の終わりに、それらはバインド先のテンポラリーと共に破棄されます。そのため、それらのライフタイムはテンポラリーのライフタイムと同じである必要があります。

編集:標準のこの部分は、2つの初期化間の不一致を説明できますか:

— それ以外の場合、T が参照型の場合、T によって参照される型の一時的な prvalue はリスト初期化され、参照はその一時的なものにバインドされます。[ 注: いつものように、参照型が非 const 型への左辺値参照である場合、バインディングは失敗し、プログラムは不正な形式になります。— エンドノート]

4

2 に答える 2

4

このような動作は正しくありません。8.5.4p3 の最後の 4 番目のブレットを参照してください。これは、しばらくの間、標準化前のドラフトでは当てはまりましたが、C++11 では当てはまりません。

混乱しているようです: 決して一時的なものを作成するべきではありません. どちらの場合も、参照を別の参照で初期化する必要があります。2 番目のケースでのみ、参照を直接初期化するのではなく、テンポラリを作成してメンバー参照にバインドする必要があると一部の標準化前のドラフトで述べられていました。

(このリストの 27 番を参照してください)。

于 2013-06-29T17:22:28.473 に答える
2

最初のサンプルでは、​​バインドされた一時オブジェクトが A のインスタンスの存続期間中存続することがわかりましたが、これは B のインスタンスには当てはまりません。そのような動作は C++11 標準に従って正しいですか?

の動作Bは正しいです。しかし、 の動作はA、一時オブジェクトの存続期間が のオブジェクトの存続期間(または の場合はの存続期間) まで存続してはならないという点で間違っています。ABB

ただし、補足として、一時的な を のメンバーにバインドしているため、B注意してください。コンストラクターが戻ったときに一時的なものは存在しません。つまり、メンバーが参照するものは存在しません!

于 2013-06-29T17:23:21.237 に答える