Как работает 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. Насколько такое поведение стандартно?
Re: Как работает pair в С++11?
От: BulatZiganshin  
Дата: 17.02.15 11:36
Оценка: 4 (2) +3
Здравствуйте, Went, Вы писали:

W>1. Что такое {1, 10.0f} в данном случае? Это же не список инициализации (там аргументы однотипные). При попытке вытащить тип через auto или decltype получаю странные ошибки.


https://ru.wikipedia.org/wiki/C%2B%2B11#.D0.A3.D0.BD.D0.B8.D0.B2.D0.B5.D1.80.D1.81.D0.B0.D0.BB.D1.8C.D0.BD.D0.B0.D1.8F_.D0.B8.D0.BD.D0.B8.D1.86.D0.B8.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Как работает pair в С++11?
От: Went  
Дата: 17.02.15 11:50
Оценка: :)
Здравствуйте, BulatZiganshin, Вы писали:
BZ>https://ru.wikipedia.org/wiki/C%2B%2B11#.D0.A3.D0.BD.D0.B8.D0.B2.D0.B5.D1.80.D1.81.D0.B0.D0.BB.D1.8C.D0.BD.D0.B0.D1.8F_.D0.B8.D0.BD.D0.B8.D1.86.D0.B8.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F
Понял, пасиба. Вот я балда
Re: Abyx, с чем вы не согласны?
От: Went  
Дата: 17.02.15 11:53
Оценка: +5
Мне просто интересно. "-1" означает несогласие с мнением автора поста. С какой строчкой конкретно вы готовы спорить? Вы спорите с моим незнанием языка?
Re[2]: Abyx, с чем вы не согласны?
От: Sni4ok  
Дата: 17.02.15 14:59
Оценка:
Здравствуйте, Went, Вы писали:

W>С какой строчкой конкретно вы готовы спорить?


я не abyx, но ответ на ваш вопрос гуглится за 15 секунд.
Re[3]: Abyx, с чем вы не согласны?
От: Went  
Дата: 17.02.15 16:00
Оценка:
Здравствуйте, Sni4ok, Вы писали:
S>я не abyx, но ответ на ваш вопрос гуглится за 15 секунд.
Понял.
Re[3]: Abyx, с чем вы не согласны?
От: Константин Россия  
Дата: 18.02.15 04:34
Оценка: +5 :))
Здравствуйте, Sni4ok, Вы писали:

W>>С какой строчкой конкретно вы готовы спорить?

S>я не abyx, но ответ на ваш вопрос гуглится за 15 секунд.

Если глядя на этот код сразу хочется загуглить "uniform initialization C++11", то всё здорово — за 15 секунд можно уложиться.
x.push_back({1, 10.0f});
Re[2]: Abyx, с чем вы не согласны?
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 18.02.15 04:48
Оценка: :))) :))
Здравствуйте, Went, Вы писали:

W>Мне просто интересно. "-1" означает несогласие с мнением автора поста. С какой строчкой конкретно вы готовы спорить? Вы спорите с моим незнанием языка?


Он слишком крут что бы отвечать на простые вопросы, но слишком вежлив (или ленив) что бы писать RTFM. Поэтому ставит минус
Re[2]: Abyx, с чем вы не согласны?
От: Mr.Delphist  
Дата: 20.02.15 12:25
Оценка:
Здравствуйте, Went, Вы писали:

W>Мне просто интересно. "-1" означает несогласие с мнением автора поста. С какой строчкой конкретно вы готовы спорить? Вы спорите с моим незнанием языка?


Странно, вроде бы Вы давно на формуе, и до сих пор не знаете о риторическом характере сабжа?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.