Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量';让我们回到原地_C++_Stl_C++11 - Fatal编程技术网

C++ 向量';让我们回到原地

C++ 向量';让我们回到原地,c++,stl,c++11,C++,Stl,C++11,你能解释一下“完美转发”是如何工作的吗 我读到向量的emplace_back不需要复制或移动对象,因为它的参数是作为可变模板实现的 std::vector<T>::emplace_back(_Args&&... __args) std::vector::emplace_back(_Args&&…_Args) 你能更详细地描述一下吗?为什么它既不复制也不移动?将元素放回原处直接在向量中的正确位置构造元素。想象一下 vector<T> v; v.empla

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

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

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

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

将元素放回原处直接在向量中的正确位置构造元素。想象一下

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

(事实上,将参数转发为
std::forward()…
要复杂一点,但要获得emplace操作的密钥可能会更混乱)

在emplace\u back中实际上发生了两件事:

  • 您不会将类型为t的对象传递给类型为t的构造函数,而是将参数传递给类型为t的构造函数。这样,对象构造会延迟:扩展向量以容纳新对象所需的内存,并调用构造函数初始化向量中的对象。可变模板与副本无关,它们只允许将可变数量的参数转发给构造函数
  • 构造函数本身的参数不会被复制,因为它们作为右值引用传递,并且std::move用于将它们转发给构造函数。基本上,移动语义可以避免对象的深度复制

  • 实际上,
    std::vector
    emplace\u back
    确实需要移动对象以避免不必要的
    idx
    new (v.data()+idx) T(a,b,c);