Рассмотрим следующие программы:
// http://ideone.com/4I0dT
#include <limits>
#include <iostream>
int main()
{
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
std::cout << result;
}
и
// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>
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
. Но я не вижу в общем случае, как это разрешимо. Это поведение undefined, которое я вижу или что-то еще?