Здравствуйте, наткнулся на интересную (для меня) фичу С++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. Насколько такое поведение стандартно?