Вы путаете два разных понятия:
1) списки инициализаторов
initializer_list<T>
: , который в основном используется для инициализации коллекций . В этом случае все члены должны быть одного типа. (не применимо для std::pair
)
Пример:
std::vector<int> vec {1, 2, 3, 4, 5};
2) Единая инициализация
Uniform initialization
: фигурные скобки используются для создания и инициализации некоторых объектов, таких как структуры, классы (с соответствующим конструктором) и базовые c типы (int, char, et c.).
.
Пример:
struct X { int x; std::string s;};
X x{1, "Hi"}; // Not an initializer_list here.
Отметив, что для инициализации std::pair
с помощью инициализатора фигурных скобок вам понадобится конструктор, который принимает два элемента, т.е. первый и второй элементы, а не std::initializer_list<T>
. Например, на моей машине с установленным VS2015 этот конструктор выглядит так:
template<class _Other1,
class _Other2,
class = enable_if_t<is_constructible<_Ty1, _Other1>::value
&& is_constructible<_Ty2, _Other2>::value>,
enable_if_t<is_convertible<_Other1, _Ty1>::value
&& is_convertible<_Other2, _Ty2>::value, int> = 0>
constexpr pair(_Other1&& _Val1, _Other2&& _Val2) // -----> Here the constructor takes 2 input params
_NOEXCEPT_OP((is_nothrow_constructible<_Ty1, _Other1>::value
&& is_nothrow_constructible<_Ty2, _Other2>::value))
: first(_STD forward<_Other1>(_Val1)), // ----> initialize the first
second(_STD forward<_Other2>(_Val2)) // ----> initialize the second
{ // construct from moved values
}