C++ 通过列表初始化分配向量大小(大括号)

C++ 通过列表初始化分配向量大小(大括号),c++,c++11,list-initialization,C++,C++11,List Initialization,我如何做以下等效工作: #include <vector> size_t bufferSize = 1024 * 1024; std::vector<unsigned char> buffer(bufferSize, ' '); #包括 大小\u t bufferSize=1024*1024; 标准::向量缓冲区(缓冲区大小,”); 是否使用列表(大括号)初始化 当我尝试执行以下操作时: #include <vector> size_t bufferS

我如何做以下等效工作:

#include <vector>

size_t bufferSize = 1024 * 1024;
std::vector<unsigned char> buffer(bufferSize, ' ');
#包括
大小\u t bufferSize=1024*1024;
标准::向量缓冲区(缓冲区大小,”);
是否使用列表(大括号)初始化

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

#include <vector>

size_t bufferSize = 1024 * 1024;
std::vector<unsigned char> buffer {bufferSize, ' '};
#包括
大小\u t bufferSize=1024*1024;
std::向量缓冲区{bufferSize',};

它错误地将
bufferSize
解释为要存储在容器的第一个索引中的值(即调用错误的
std::vector
构造函数),并且由于来自
无符号int
的无效缩小转换而无法编译(
size\u t
)到
无符号字符

简短回答:你没有

这不是统一初始化本身的问题,而是
std::initializer\u list
的问题。如果使用列表初始化,总是会优先考虑使用
std::initializer_list
的构造函数,而不管是否存在其他可能需要较少隐式转换的构造函数


我建议使用

std::vector<unsigned char> buffer(bufferSize, ' ');
std::向量缓冲区(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)
显式向量(大小\u类型计数,
常数T&value=T(),
常量分配器&alloc=Allocator())//(1)
向量(std::初始值设定项\列表初始值,
常量分配器&alloc=Allocator());//(2)
这两个重载具有明确的含义,其中第二个重载用于使用
std::initializer\u list
的元素初始化向量

当使用
列表初始化
时,重载解析首选初始值设定项列表构造函数


list initialization
不允许缩小转换,您正试图使用
T=unsigned char
创建
std::vector
,但是
std::initializer\u list
参数的推导
T
将涉及缩小转换(不允许).

为什么你坚持要用“花括号初始化”来实现这一点?@MaxLanghof嗯,这叫做统一初始化。人们可能会认为它应该是初始化对象的首选方式;)@NaNaulver相关的@ OP是一个非常好的关于C++初始化噩梦的讨论:@ Max LangHOF,因为一些建议使用它到处都是因为它是“更安全”的(没有最令人烦恼的解析问题)。事实上,这更危险。