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