c++ - 使用列表初始化(花括号)分配 vector 大小

标签 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 构造函数),并且无法编译由于从 unsigned int (size_t) 到 unsigned char 的无效缩小转换。

最佳答案

简短回答:你没有

这不是统一初始化本身的问题,而是 std::initializer_list 的问题。有一个 special rule重载决议中,如果使用列表初始化始终优先考虑采用std::initializer_list的构造函数,无论可能需要较少隐式转换的其他构造函数的存在。


我建议使用

std::vector<unsigned char> buffer(bufferSize, ' ');

或者,如果您真的想要使用列表初始化,请围绕std::vector 创建您的包装器,提供构造函数重载正确的事情。

关于c++ - 使用列表初始化(花括号)分配 vector 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541937/

相关文章:

c++ - 将 Unicode 的 UTF8 表示写入文件

c++ - 有没有办法在 C++ 中连接两个数组并返回它们?

c++ - 私有(private)元素错误

c++ - 如何获取类(不是对象)的引用/指针?

c++ - 奇怪的 unsigned long long int 行为

multithreading - 使用 boost::lockfree::spsc_queue 时需要内存屏障吗?

c++ - const 和 constexpr 数组之间的区别

c++ - 在成员初始化器列表中使用大括号初始化会导致 std::vector 复制构造中的堆栈溢出(使用 GCC 但不使用 Clang)

C++ 多次转发一个引用 : first copy and then move

c++ - 为什么 GCC 6.3 在没有明确 C++11 支持的情况下编译这个 Braced-Init-List 代码?