[英]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
构造函数),并且由于unsigned int
( size_t
)到unsigned char
无效缩小转换而无法编译。
简短的回答: 你没有 。
这不是统一初始化本身的问题,而是使用std::initializer_list
。 在重载解析中有一个特殊的规则 ,如果使用了列表初始化 ,它总是优先考虑使用std::initializer_list
构造函数 ,而不管是否存在可能需要较少隐式转换的其他构造函数。
我建议使用
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
的元素初始化向量。
使用list-initialization
时,重载决策更喜欢初始化列表构造list-initialization
。
list-initialization
不允许缩小转换,您尝试使用T=unsigned char
创建std::vector
但是std::initializer_list
参数的推导T
是T= unsigned long
,这将涉及缩小转换(不是允许)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.