アドレス サニタイザーが文句を言っています。
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
}
アドレス サニタイザーが文句を言っています。
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
}
はい、これにより未定義の動作が発生します。
const 参照を一時オブジェクトにバインドすると、一時オブジェクトの有効期間がバインドされた参照のスコープまで延長されます。あなたの場合、これは関数bar
です。bar
したがって、関数が終了した後は一時的にアクセスできません。
編集:
標準で調べたところ、実際には一時的なものの存続期間は、 を含む完全な式にまで延長されましたbar
。したがってBOOST_FOREACH
、コードがUBであるかどうかは、実装方法によって異なります。
N3337 12.2.5 から
関数呼び出し (5.2.2) の参照パラメーターへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続します。
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()