【问题标题】:Does this cause undefined behavior?这会导致未定义的行为吗?
【发布时间】:2014-11-19 14:27:02
【问题描述】:

地址清理程序在抱怨。

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
}

【问题讨论】:

  • “地址消毒剂在抱怨” - 它究竟在抱怨什么关于

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


【解决方案1】:

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

【讨论】:

  • 你确定吗? Boost 文档说,它适用于临时性。
  • 你在链接的文本中哪里看到的?
  • 迭代一个按值返回序列的表达式(即右值):
  • 完全正确 - “按值返回序列”,而不是按引用返回序列
【解决方案2】:

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

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

编辑:

在标准中查找它,实际上临时的生命周期已扩展到包含bar 的完整表达式。所以要看你的代码是不是UB,BOOST_FOREACH是怎么实现的。

从 N3337 12.2.5

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

【讨论】:

  • 但是,临时的不会被另一个引用捕获吗?从而延长生命周期直到那个参考?
  • @balki AFAIK 没有重新绑定临时文件这样的事情。
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 2016-09-04
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2016-02-17
  • 2022-11-16
  • 2019-08-02
相关资源
最近更新 更多