地址消毒剂正在抱怨。
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
}
答案 0 :(得分:1)
是。 FOREACH发生在对由foo调用创建的结构的引用上,并在传递给bar()后超出范围
答案 1 :(得分:1)
是的,这会导致未定义的行为。
将const引用绑定到临时时,临时的生命周期将扩展到绑定引用的范围。在您的情况下,这是函数bar
。因此,在bar
函数退出后,您无法访问临时文件。
修改强>
在标准中查找它,实际上临时的生命周期扩展到包含bar
的完整表达式。因此,无论您的代码是否为UB,都取决于BOOST_FOREACH
的实现方式。
来自N3337 12.2.5
临时绑定到a中的引用参数 函数调用(5.2.2)一直持续到完全完成 包含调用的表达式。