Рассмотрим следующие программы:
// 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, которое я вижу или что-то еще?