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

时间:2018-11-29 15:04:54

标签: c++ c++11 list-initialization

我该如何做:

#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

2 个答案:

答案 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,这将涉及缩小的转换(不允许)。

相关问题