Когда инициализатор является списком инициализатора, когда сначала рассматривается конструктор, который принимает std :: initializer_list.
Таким образом, для этого объявления
std::vector<int> v{32};
используется ограничитель Класс std :: vector, имеющий первый параметр типа std::initializer_list<T
>.
vector(initializer_list<T>, const Allocator& = Allocator());
В этом случае std::initializer_list<int>
содержит только один элемент, равный 32.
В этом объявлении
std::vector<Day> day{32};
список инициализатора {32} не может быть преобразован в std::initializer_list<Day>
. Поэтому конструктор, принимающий список инициализаторов, не подходит.
В этом случае компилятор рассматривает другие конструкторы и находит конструктор, который принимает целое число в качестве числа элементов в векторе.
explicit vector(size_type n, const Allocator& = Allocator());
Обратите внимание, что этот конструктор явный. Так, например, вы не можете написать
std::vector<Day> day = {32};
из стандарта C ++ 17 (13.3.1.7 Инициализация с помощью инициализации списка)
1 Когда объекты неагрегированного класса имеют тип T инициализируются списком так, что 8.5.4 указывает, что разрешение перегрузки выполняется в соответствии с правилами этого раздела, разрешение перегрузки выбирает конструктор в два этапа :
(1.1) - Первоначально функции-кандидаты являются конструкторами списка инициализаторов (8.5.4) класса T , а список аргументов состоит из списка инициализаторов как единственного аргумента.
(1.2) - Если жизнеспособный конструктор списка инициализаторов не найден , разрешение перегрузки выполняется снова, где все функции-кандидаты являются конструкторами класса T, а список аргументов состоит из элементов списка инициализатора.