Выделить размер вектора с помощью инициализации списка (фигурные скобки)

Как я могу сделать 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.

Ответы

Ответ 1

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

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


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

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

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

Ответ 2

Две соответствующие перегрузки 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 что будет включать сужающее преобразование (не позволил).