我该如何做:
#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
构造函数),并且由于从{{1 }}(unsigned int
)到size_t
。
答案 0 :(得分:12)
简短答案:您不。
这不是统一初始化本身的问题,而是std::initializer_list
的问题。 重载分辨率中有一个special rule ,如果使用 list-initialization ,则始终会优先考虑使用std::initializer_list
的构造函数,无论是否存在其他可能需要较少隐式转换的构造函数。
我建议使用
std::vector<unsigned char> buffer(bufferSize, ' ');
或者,如果您真的要使用 list-initialization ,请在std::vector
周围创建包装器,以提供构造函数重载,以完成正确的事情。
答案 1 :(得分:5)
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
不允许缩小转换,您正在尝试使用std::vector
创建一个T=unsigned char
,但是推导的T
的{{1}}是std::initializer_list
,这将涉及缩小的转换(不允许)。