1

我想通过包装器将列表初始化的向量传递给工作函数。我不需要原始函数(main)中的值,所以我应该移动它吗?

该文档指出:

复制 std::initializer_list 不会复制底层对象。

所以成本可能是最小的,但是移动它仍然有优势,还是列表复制省略并且向量直接列表初始化?

(编译)代码

#include <iostream>
#include <vector>


void worker(std::vector<int>&& some_ints)
{
    std::cout << "I hope my ints arrive here without further overhead :)" << std::endl;
}

void wrapper(std::vector<int>&& some_ints)
{
    worker(std::move(some_ints));
}

int main()
{
    wrapper( { 1, 5 } ); // <-- std::move here?
}
4

1 回答 1

1

一个花括号初始化列表不是一个std:initializer_list.

这里:

wrapper( { 1, 5 } );

重载决议找到对void wrapper(std::vector<int>&&)调用来说是可行重载的重载:创建一个绑定到函数的右值引用参数的临时std::vector<int>对象(通过std::initializer_list<T>构造函数的列表初始化) 。std::vector<T>wrapper

试图移动一个支撑初始化列表

wrapper(std::move({ 1, 5 }));  // error

是非法的(Tstd::move<T>(T&&)函数模板中无法推断)。

于 2022-02-04T15:17:57.113 回答