Como as regras de promoção funcionam quando a assinatura nos dois lados de um operador binário é diferente? [duplicado

Esta pergunta já tem uma resposta aqui:

egras de conversão de tipo implícito em operadores C 9 respostas

Considere os seguintes programas:

// 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;
}

Como o operador + "sabe" qual é o tipo correto para retornar? A regra geral é converter todos os argumentos para o tipo mais amplo, mas aqui não há um "vencedor" claro entreint eunsigned int. No primeiro caso,unsigned int deve ser escolhido como resultado deoperator+, porque eu obtenho um resultado de2147483648. No segundo caso, ele deve estar escolhendoint, porque eu obtenho um resultado de-1. No entanto, não vejo no caso geral como isso é decidível. Esse comportamento indefinido que estou vendo ou algo mais?