Выделить размер вектора с помощью инициализации списка (фигурные скобки) - PullRequest
0 голосов
/ 29 ноября 2018

Как я могу сделать equivelant:

#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.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Две соответствующие перегрузки 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 для параметра std::initializer_list равно T= unsigned long, что включаетсужающее преобразование (не допускается).

0 голосов
/ 29 ноября 2018

Краткий ответ: Вы не .

Это не проблема с равномерной инициализацией как таковой, но с std::initializer_list.Существует специальное правило в разрешении перегрузки , которое всегда отдает приоритет конструкторам, принимающим std::initializer_list, если используется list-initialization , независимо ото существовании других конструкторов, которые могут потребовать менее явных преобразований.


Я бы предложил использовать

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

или, если вы действительно хотите использовать list-initialization , создайте свою оболочку вокруг std::vector, которая обеспечивает перегрузки конструктора, которые делают правильные вещи.

...