簡體   English   中英

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

[英]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構造函數),並且由於unsigned intsize_t )到unsigned char無效縮小轉換而無法編譯。

簡短的回答: 你沒有

這不是統一初始化本身的問題,而是使用std::initializer_list 重載解析中有一個特殊的規則 ,如果使用了列表初始化 ,它總是優先考慮使用std::initializer_list構造函數 ,而不管是否存在可能需要較少隱式轉換的其他構造函數。


我建議使用

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的元素初始化向量。

使用list-initialization時,重載決策更喜歡初始化列表構造list-initialization

list-initialization不允許縮小轉換,您嘗試使用T=unsigned char創建std::vector但是std::initializer_list參數的推導TT= unsigned long ,這將涉及縮小轉換(不是允許)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM