-1

アドレス サニタイザーが文句を言っています。

struct X
{
  iterator begin();
  iterator end();
};

X foo();

const X& bar(const X& x)
{
  return x;
}

BOOST_FOREACH(const auto& xitem, bar(foo()))
{
  //use xitem
}
4

2 に答える 2

1

はい、これにより未定義の動作が発生します。

const 参照を一時オブジェクトにバインドすると、一時オブジェクトの有効期間がバインドされた参照のスコープまで延長されます。あなたの場合、これは関数barです。barしたがって、関数が終了した後は一時的にアクセスできません。

編集:

標準で調べたところ、実際には一時的なものの存続期間は、 を含む完全な式にまで延長されましたbar。したがってBOOST_FOREACH、コードがUBであるかどうかは、実装方法によって異なります。

N3337 12.2.5 から

関数呼び出し (5.2.2) の参照パラメーターへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続します。

于 2014-11-19T15:08:42.120 に答える
1

Yes. The FOREACH is happening on a reference to a struct which has been created by the foo call, and gone out of scope after being passed through to bar()

于 2014-11-19T14:31:07.340 に答える