Этот проект стандарта показывает синопсис для initializer_list
. У него нет частного конструктора.
Но две реализации стандартных библиотек, которые я рассмотрел, libstdc++ и libc++, обе предоставляют частные конструкторы:
// The compiler can call a private constructor.
constexpr initializer_list(const_iterator __a, size_type __l)
: _M_array(__a), _M_len(__l) { }
_LIBCPP_ALWAYS_INLINE
_LIBCPP_CONSTEXPR_AFTER_CXX11
initializer_list(const _Ep* __b, size_t __s) _NOEXCEPT
: __begin_(__b),
__size_(__s)
{}
Я считаю, что часть, где этот частный конструктор "подразумевается", проистекает из §8.5.4/5:
Объект типа
std::initializer_list<E>
создается из списка инициализаторов, как если бы реализация выделила временный массив из N элементов типаconst E
, где N — количество элементов в инициализаторе. список. Каждый элемент этого массива инициализируется копированием с соответствующим элементом списка инициализаторов, и объектstd::initializer_list<E>
создается для ссылки на этот массив.
Итак, мои вопросы:
Синопсис не указан?
Нужен ли библиотеке частный конструктор? Что он делает, чего не может компилятор?