тип беззнакового короткого вычитания

у меня есть короткая программа, которая не компилируется:

    #include <algorithm>

    int main(int argc, char *argv[])
    {
        unsigned short a = 490;
        unsigned short b = 43;

        unsigned short d = std::min(b, a-b);

        return 0;
    }

компилятор (версия g++ 4.8.4) говорит:

    ./main.cpp: In function ‘int main(int, char**)’:
    ./main.cpp:25:47: error: no matching function for call to ‘min(short unsigned int&, int)’
                 unsigned short d = std::min(b, a-b);
                                                   ^
    ./main.cpp:25:47: note: candidates are:
    In file included from /usr/include/c++/4.8/algorithm:61:0,
                     from ./main.cpp:18:
    /usr/include/c++/4.8/bits/stl_algobase.h:193:5: note: template<class _Tp> const _Tp& std::min(const _Tp&, const _Tp&)
         min(const _Tp& __a, const _Tp& __b)
         ^
    /usr/include/c++/4.8/bits/stl_algobase.h:193:5: note:   template argument deduction/substitution failed:
    ./main.cpp:25:47: note:   deduced conflicting types for parameter ‘const _Tp’ (‘short unsigned int’ and ‘int’)
                 unsigned short d = std::min(b, a-b);
                                                   ^
    In file included from /usr/include/c++/4.8/algorithm:61:0,
                     from ./main.cpp:18:
    /usr/include/c++/4.8/bits/stl_algobase.h:239:5: note: template<class _Tp, class _Compare> const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
         min(const _Tp& __a, const _Tp& __b, _Compare __comp)
         ^
    /usr/include/c++/4.8/bits/stl_algobase.h:239:5: note:   template argument deduction/substitution failed:
    ./main.cpp:25:47: note:   deduced conflicting types for parameter ‘const _Tp’ (‘short unsigned int’ and ‘int’)
                 unsigned short d = std::min(b, a-b);

поэтому очевидно, что беззнаковое короткое вычитание приводит к целому числу.

Вопрос: Почему?

Редактировать: Я видел дубликат при поиске, но не дочитал до конца. Они говорят: "Примечание. Минимальный размер операций - int. Таким образом, тип short/char преобразуется в int до того, как операция будет выполнена". Что объясняет поведение..


person Adam    schedule 24.04.2016    source источник
comment
@AlanStokes Я не думаю, что дубликат отвечает на этот вопрос. В примере с OP оба типа имеют значение unsigned int, поэтому дело не в том, что один операнд преобразуется в другой.   -  person Cory Kramer    schedule 24.04.2016
comment
@CoryKramer a и b оба равны unsigned short, поэтому их повышают до int для вычитания. Вот почему компилятор ищет min(unsigned short int, int).   -  person Alan Stokes    schedule 24.04.2016
comment
@ Алан Стоукс, почему они повышены до int для вычитания. они оба unsigned short? Я прочитал один из ответов по дублирующейся ссылке, в которой говорится: Если оба операнда имеют один и тот же тип, дальнейшее преобразование не требуется.   -  person Biruk Abebe    schedule 24.04.2016
comment
@AlanStokes Я думаю, что это путаница. Дублирующая ссылка описывает, что когда два операнда различаются по типу, один из них повышается до другого. Но если два операнда одного типа, зачем требуется какое-либо продвижение? en.cppreference.com/w/cpp/language/operator_arithmetic   -  person Cory Kramer    schedule 24.04.2016
comment
@Adam Чтобы более прямо ответить на ваш вопрос, отсюда В частности, арифметические операторы не принимают в качестве аргументов типы меньше int, а целочисленные повышения автоматически применяются после преобразования lvalue в rvalue, если это применимо. Это преобразование всегда сохраняет значение.   -  person Cory Kramer    schedule 24.04.2016
comment
@CoryKramer Потому что типы меньше int всегда продвигаются. Верхний ответ говорит Примечание. Минимальный размер операций — int. Таким образом, short/char преобразуются в int до завершения операции. См. также en.cppreference .com/w/cpp/language/implicit_conversion (в рамках комплексного продвижения).   -  person Alan Stokes    schedule 24.04.2016
comment
@AlanStokes Я не заметил, что в ответе в дублирующемся посте упоминалось, что это моя ошибка, хороший улов. Я не говорил, что вы были неправы, интегральные правила продвижения действительно применяются (как я указал выше). Я просто не осознавал, что дубликат сообщения затрагивал эту деталь, и искал другую ссылку, описывающую это поведение.   -  person Cory Kramer    schedule 24.04.2016
comment
@CoryKramer Да, этот ответ может быть связан с небольшим редактированием. Я не мог найти лучшего канонического ответа.   -  person Alan Stokes    schedule 24.04.2016