18

您能解释一下“完美转发”的工作原理吗?

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

std::vector<T>::emplace_back(_Args&&... __args)

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

4

2 回答 2

15

emplace_back直接在向量中的正确位置构造元素。想想就好像

vector<T> v;
v.emplace_back(a,b,c);

转换为(idx 为新索引)

new (v.data()+idx) T(a,b,c);

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

于 2012-07-09T10:13:46.577 回答
2

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

  1. 您不会将 T 类型的对象传递给 T 的构造函数,而是将参数传递给 T 的构造函数。这样,​​对象构造就会被延迟:向量被扩展以适应新对象所需的内存,并调用构造函数来初始化对象在向量中。可变参数模板与副本没有任何关系,它们只允许将可变数量的参数转发给构造函数。
  2. 构造函数本身的参数不会被复制,因为它们作为右值引用传递,并且 std::move 用于将它们转发给构造函数。基本上,移动语义避免了对象的深拷贝。
于 2012-07-09T10:17:47.233 回答