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

not*_*ien 11 c++ c++11 list-initialization

我怎样才能做到平等:

#include <vector>

size_t bufferSize = 1024 * 1024;
std::vector<unsigned char> buffer(bufferSize, ' ');
Run Code Online (Sandbox Code Playgroud)

使用列表(花括号)初始化?

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

#include <vector>

size_t bufferSize = 1024 * 1024;
std::vector<unsigned char> buffer {bufferSize, ' '};
Run Code Online (Sandbox Code Playgroud)

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

Vit*_*meo 12

简短的回答:你没有.

这不是统一初始化本身的问题,而是std::initializer_list.在重载解析中有一个特殊的规则,如果使用了列表初始化,它总是优先考虑构造函数,无论是否存在可能需要较少隐式转换的其他构造函数.std::initializer_list


我建议使用

std::vector<unsigned char> buffer(bufferSize, ' ');
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的想使用列表初始化,创建你的包装器std::vector,提供做正确的事情的构造函数重载.


Jan*_*ans 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)
Run Code Online (Sandbox Code Playgroud)

这两个重载具有明确的含义,其中第二个用于初始化带有元素的向量std::initializer_list.

使用时,重载决策更喜欢初始化列表构造函数list-initialization.

不允许缩小转换次数list-initialization,您尝试创建一个std::vectorwith,T=unsigned char但推导出Tstd::initializer_list参数T= unsigned long将涉及缩小转换(不允许).