На этот вопрос уже есть ответ здесь:
Рассмотрим следующие программы:
// http://ideone.com/4I0dT
#include
#include
int main()
{
int max = std::numeric_limits::max();
unsigned int one = 1;
unsigned int result = max + one;
std::cout << result;
}
и
// http://ideone.com/UBuFZ
#include
#include
int main()
{
unsigned int us = 42;
int neg = -43;
int result = us + neg;
std::cout << result;
}
Как происходит оператор + "знать", какой тип нужно вернуть? Общее правило - преобразовать все аргументы в самый широкий тип, но здесь нет явного «победителя» между int
и unsigned int
. В первом случае unsigned int
должен быть выбран как результат operator +
, потому что я получаю результат 2147483648
. Во втором случае он должен выбрать int
, потому что я получаю результат -1
. Однако в общем случае я не понимаю, как это разрешимо. Я вижу это неопределенное поведение или что-то еще?