这是否会导致未定义的行为?

时间:2014-11-19 14:27:03

标签: c++ undefined-behavior boost-foreach

地址消毒剂正在抱怨。

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
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

是的,这会导致未定义的行为。

将const引用绑定到临时时,临时的生命周期将扩展到绑定引用的范围。在您的情况下,这是函数bar。因此,在bar函数退出后,您无法访问临时文件。

修改

在标准中查找它,实际上临时的生命周期扩展到包含bar的完整表达式。因此,无论您的代码是否为UB,都取决于BOOST_FOREACH的实现方式。

来自N3337 12.2.5

  

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