у меня есть короткая программа, которая не компилируется:
#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 до того, как операция будет выполнена". Что объясняет поведение..
unsigned int
, поэтому дело не в том, что один операнд преобразуется в другой. - person Cory Kramer   schedule 24.04.2016a
иb
оба равныunsigned short
, поэтому их повышают доint
для вычитания. Вот почему компилятор ищетmin(unsigned short int, int)
. - person Alan Stokes   schedule 24.04.2016unsigned short
? Я прочитал один из ответов по дублирующейся ссылке, в которой говорится: Если оба операнда имеют один и тот же тип, дальнейшее преобразование не требуется. - person Biruk Abebe   schedule 24.04.2016int
, а целочисленные повышения автоматически применяются после преобразования lvalue в rvalue, если это применимо. Это преобразование всегда сохраняет значение. - person Cory Kramer   schedule 24.04.2016int
всегда продвигаются. Верхний ответ говорит Примечание. Минимальный размер операций — int. Таким образом, short/char преобразуются в int до завершения операции. См. также en.cppreference .com/w/cpp/language/implicit_conversion (в рамках комплексного продвижения). - person Alan Stokes   schedule 24.04.2016