您能解释一下“完美转发”的工作原理吗?
我读到vector的emplace_back不需要复制或移动对象,因为它的参数是作为可变参数模板实现的。
std::vector<T>::emplace_back(_Args&&... __args)
你能更详细地描述一下吗?为什么不复制或移动?
答案 0 :(得分:15)
emplace_back
直接在向量中的正确位置构造元素。把它想象成好像
vector<T> v;
v.emplace_back(a,b,c);
转换为(idx是新索引)
new (v.data()+idx) T(a,b,c);
(现实情况有点复杂,涉及将参数转发为std::forward<_Args>()...
,但是获取行动操作的关键可能会更加混乱)
答案 1 :(得分:2)
emplace_back实际上发生了两件事: