首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量的emplace_back

向量的emplace_back
EN

Stack Overflow用户
提问于 2012-07-09 18:06:08
回答 2查看 2.7K关注 0票数 18

你能解释一下“完美转发”是如何工作的吗?

我读到向量的emplace_back不需要复制或移动对象,因为它的参数是作为可变模板实现的。

代码语言:javascript
复制
std::vector<T>::emplace_back(_Args&&... __args)

你能更详细地描述一下吗?为什么它不能复制也不能移动?

EN

回答 2

Stack Overflow用户

发布于 2012-07-09 18:13:47

emplace_back直接在向量中的正确位置构造元素。把它想象成

代码语言:javascript
复制
vector<T> v;
v.emplace_back(a,b,c);

被转换为(idx是新的索引)

代码语言:javascript
复制
new (v.data()+idx) T(a,b,c);

(实际情况有点复杂,涉及到将参数作为std::forward<_Args>()...转发,但获取emplace操作的密钥可能会更令人困惑)

票数 15
EN

Stack Overflow用户

发布于 2012-07-09 18:17:47

在emplace_back中实际上发生了两件事:

  1. 您不会将T类型的对象传递给T的构造函数,而是将参数传递给T的构造函数。这样,对象构造就会延迟:向量被扩展以容纳新对象所需的内存,构造函数被调用以初始化向量中的对象。可变模板与副本没有任何关系,它们只允许将数量可变的参数转发给构造函数,因为它们是作为rvalues引用传递的,而std::move用于将它们转发给构造函数。基本上,移动语义避免了对象的深层副本。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11392910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档