使用列表初始化(花括号)分配向量大小
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
构造函数),并且由于 std::vector
的无效收缩转换而无法编译=14=] (size_t
) 到 unsigned char
.
简短回答:你不会。
这不是统一初始化本身的问题,而是 std::initializer_list
的问题。 overload resolution中有一个special rule always优先考虑std::initializer_list
if list的构造函数-initialization 被使用,不管是否存在其他可能需要较少隐式转换的构造函数。
我建议使用
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
的元素初始化vector。
当使用 list-initialization
时,重载解析更喜欢初始化列表构造函数。
list-initialization
不允许缩小转换,您正在尝试使用 T=unsigned char
创建 std::vector
,但为 std::initializer_list
推导出 T
参数是 T= unsigned long
,这将涉及缩小转换(不允许)。
我怎样做相当于:
#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
构造函数),并且由于 std::vector
的无效收缩转换而无法编译=14=] (size_t
) 到 unsigned char
.
简短回答:你不会。
这不是统一初始化本身的问题,而是 std::initializer_list
的问题。 overload resolution中有一个special rule always优先考虑std::initializer_list
if list的构造函数-initialization 被使用,不管是否存在其他可能需要较少隐式转换的构造函数。
我建议使用
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
的元素初始化vector。
当使用 list-initialization
时,重载解析更喜欢初始化列表构造函数。
list-initialization
不允许缩小转换,您正在尝试使用 T=unsigned char
创建 std::vector
,但为 std::initializer_list
推导出 T
参数是 T= unsigned long
,这将涉及缩小转换(不允许)。