Как работает pair в С++11?
От: Went  
Дата: 17.02.15 11:22
Оценка: -1
Здравствуйте, наткнулся на интересную (для меня) фичу С++11 в 13-ой студии (может и не только там, но пока с другими компиляторами по С++11 не работал). Такой код:
void f()
{
  std::vector<std::pair<int, float>> x;
  x.push_back({1, 10.0f});
}

Я так написал, и оно заработало. Не врубаюсь, чес сказать, почему. Дебаггер заходит в такой конструктор:
template<class _Other1,
    class _Other2,
    class = typename enable_if<is_convertible<_Other1, _Ty1>::value
        && is_convertible<_Other2, _Ty2>::value,
        void>::type>
    pair(_Other1&& _Val1, _Other2&& _Val2)
        _NOEXCEPT_OP((is_nothrow_constructible<_Ty1, _Other1&&>::value
            && is_nothrow_constructible<_Ty2, _Other2&&>::value))
    : first(_STD forward<_Other1>(_Val1)),
            second(_STD forward<_Other2>(_Val2))
    {    // construct from moved values
    }

Он явно принимает два значения. И я не понимаю:
1. Что такое {1, 10.0f} в данном случае? Это же не список инициализации (там аргументы однотипные). При попытке вытащить тип через auto или decltype получаю странные ошибки.
2. Как это что-то смогло пролезть в конструктор с двумя аргументами?
3. Насколько такое поведение стандартно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.