-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 引用绑定到临时对象时,临时对象的生命周期会扩展到绑定引用的范围。在您的情况下,这是 function bar。因此,您无法在bar函数退出后访问临时文件。

编辑:

在标准中查找它,实际上临时的生命周期被扩展到包含bar. 因此,这取决于BOOST_FOREACH您的代码是否为 UB 是如何实现的。

从 N3337 12.2.5

临时绑定到函数调用 (5.2.2) 中的引用参数将一直持续到包含调用的完整表达式完成为止。

于 2014-11-19T15:08:42.120 回答
1

是的。FOREACH 发生在对 foo 调用创建的结构的引用上,并在传递给 bar() 后超出范围

于 2014-11-19T14:31:07.340 回答