使用列表初始化(花括号)分配向量大小

Allocate vector size with list initialization (curly braces)

我怎样做相当于:

#include <vector>

size_t bufferSize = 1024 * 1024;
std::vector<unsigned char> buffer(bufferSize, ' ');

用列表(大括号)初始化?

当我尝试执行以下操作时:

#include <vector>

size_t bufferSize = 1024 * 1024;
std::vector<unsigned char> buffer {bufferSize, ' '};

它错误地将 bufferSize 解释为要存储在容器第一个索引中的值(即调用了错误的 std::vector 构造函数),并且由于 std::vector 的无效收缩转换而无法编译=14=] (size_t) 到 unsigned char.

简短回答:你不会

这不是统一初始化本身的问题,而是 std::initializer_list 的问题。 overload resolution中有一个special rule always优先考虑std::initializer_list if list的构造函数-initialization 被使用,不管是否存在其他可能需要较少隐式转换的构造函数。


我建议使用

std::vector<unsigned char> buffer(bufferSize, ' ');

或者,如果您真的想要使用列表初始化,请围绕std::vector创建提供构造函数重载的包装器做正确的事。

std::vector 的两个相关重载是:

explicit vector( size_type count, 
                 const T& value = T(),
                 const Allocator& alloc = Allocator()); //(1)
vector( std::initializer_list<T> init, 
        const Allocator& alloc = Allocator() ); // (2)

这两个重载的含义很明确,其中第二个是用来用std::initializer_list的元素初始化vector。

当使用 list-initialization 时,重载解析更喜欢初始化列表构造函数。

list-initialization 不允许缩小转换,您正在尝试使用 T=unsigned char 创建 std::vector,但为 std::initializer_list 推导出 T参数是 T= unsigned long,这将涉及缩小转换(不允许)。