将临时右值绑定到 std::vector 构造函数中的引用左值

Posted

技术标签:

【中文标题】将临时右值绑定到 std::vector 构造函数中的引用左值【英文标题】:Bind temporary rvalue to reference lvalue in std::vector constructors 【发布时间】: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 引用可以如此绑定,这样做会延长生命周期,直到相关范围结束。 【参考方案1】:

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

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

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

【讨论】:

您的回答和 Tonys 的评论有些不一致。 Tony 建议 const 是关键点,但是,您所说的听起来通常是有效的,对于非 const 也是如此。谁是对的? @user1494080 临时对象可以绑定到 const lvalue-references 和 rvalue-references。这两条规则都适用于这些情况。

以上是关于将临时右值绑定到 std::vector 构造函数中的引用左值的主要内容,如果未能解决你的问题,请参考以下文章

移动语义的一切

emplace_back() 和 push_back 的区别

右值引用剖析

STL:emplace_back() 和 push_back 的区别

const 引用如何绑定到右值

使用 std::vector 时如何将索引信息传递给元素构造函数?