【问题标题】:Bind temporary rvalue to reference lvalue in std::vector constructors将临时右值绑定到 std::vector 构造函数中的引用左值
【发布时间】:2015-04-02 04:30:23
【问题描述】:

到目前为止,我认为我们不能将临时右值传递给左值引用。但就在最近,我仔细研究了std::vector的填充构造函数:

explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());

const value_type& val 是参考左值,= value_type() 是匿名右值,据我所知。为什么有可能?临时右值不是马上就销毁了,所以引用就没有什么可指点了吗?

【问题讨论】:

  • “我以为……” / 但是 / “为什么会这样?” - 因为你想错了:关键是只有const 引用可以如此绑定,这样做会延长生命周期,直到相关范围结束。

标签: c++ vector pass-by-reference lvalue rvalue


【解决方案1】:

标准的相关部分在[class.temporary](§12.2/5in N4140):

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

所以临时的value_type() 将绑定到val 并在构造函数期间持续存在。

【讨论】:

  • 您的回答和 Tonys 的评论有些不一致。 Tony 建议 const 是关键点,但是,您所说的听起来通常是有效的,对于非 const 也是如此。谁是对的?
  • @user1494080 临时对象可以绑定到 const lvalue-references 和 rvalue-references。这两条规则都适用于这些情况。
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 2017-12-06
  • 2014-10-31
  • 1970-01-01
  • 2017-04-13
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多