将临时右值绑定到 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/5
in N4140):
在函数调用 (5.2.2) 中临时绑定到引用参数将持续存在,直到完成 包含调用的完整表达式。
所以临时的value_type()
将绑定到val
并在构造函数期间持续存在。
【讨论】:
您的回答和 Tonys 的评论有些不一致。 Tony 建议 const 是关键点,但是,您所说的听起来通常是有效的,对于非 const 也是如此。谁是对的? @user1494080 临时对象可以绑定到 const lvalue-references 和 rvalue-references。这两条规则都适用于这些情况。以上是关于将临时右值绑定到 std::vector 构造函数中的引用左值的主要内容,如果未能解决你的问题,请参考以下文章
emplace_back() 和 push_back 的区别