我注意到当移动更适用时,std::vector 的聚合 列表初始化执行复制初始化。同时,多个 emplace_backs 做我想做的。
我只能想出这个编写模板函数的不完美解决方案init_emplace_vector
。不过,它仅适用于非显式单值构造函数。
template <typename T, typename... Args>
std::vector<T> init_emplace_vector(Args&&... args)
{
std::vector<T> vec;
vec.reserve(sizeof...(Args)); // by suggestion from user: eerorika
(vec.emplace_back(std::forward<Args>(args)), ...); // C++17
return vec;
}
Run Code Online (Sandbox Code Playgroud)
我真的需要使用 emplace_back来尽可能有效地初始化 std::vector 吗?
// an integer passed to large is actually the size of the resource
std::vector<large> v_init {
1000, // instance of class "large" is copied
1001, // copied
1002, // copied
};
std::vector<large> …
Run Code Online (Sandbox Code Playgroud)