Por que expressões genéricas do tipo C não podem ser compatíveis com C ++?

Parece que me lembro de ouvir comentários vagos de algumas fontes confiáveis (ou seja, membros do comitê falando em canais não oficiais) de que expressões genéricas do tipo C não serão adicionadas ao C ++ porque não podem ser.

Tanto quanto posso dizer, as expressões genéricas de tipo são muito limitadas em comparação com os modelos C ++ e a sobrecarga, mas não há potencial de interação que precisaria ser definido como um caso especial.

Uma expressão genérica de tipo consiste em uma expressão de controle e uma série de "associações" entre tipos e subexpressões. Uma subexpressão é escolhida com base no tipo estático da expressão de controle e nos tipos listados para as subexpressões e é substituída no lugar do TGE. A correspondência é baseada no conceito C de compatibilidade de tipos, que, até onde eu sei, é equivalente à identidade de tipos C ++ comextern vinculação sob a regra de definição única (ODR).

Seria bom se uma expressão de controle de classe derivada selecionasse uma associação de classe base em C ++, mas como C não tem herança, essa gentileza não é necessária para compatibilidade cruzada. Isso é considerado uma pedra de tropeço, afinal?

Editar: Quanto aos detalhes mais específicos, C11 já prevê a preservação da categoria de valor (subvalorização) da subexpressão escolhida e parece exigir que o TGE seja uma expressão constante (de qualquer categoria), desde que todos os seus operandos sejam, incluindo o controlando expressão. Provavelmente esse é um defeito da linguagem C. De qualquer forma, o C ++ 14 define expressões constantes em termos do que pode ser potencialmente avaliado, e a especificação TGE já diz que subexpressões não escolhidas não são avaliadas.

O ponto é que o princípio de operação da TGE parece simples o suficiente para ser transplantado sem causar problemas mais tarde.

Quanto aporque Os TGE de C ++ seriam úteis, além de maximizar a interseção de C e C ++, eles poderiam ser usados para implementar essencialmentestatic_if, sem o recurso de declaração condicional altamente controverso. Eu não sou um defensor destatic_if, mas "existe isso".

template< typename t >
void f( t q ) {
    auto is_big = _Generic( std::integral_constant< bool, sizeof q >= 4 >(),
        std::true_type: std::string( "whatta whopper" ),
        std::false_type: "no big deal"
    );
    auto message = _Generic( t, double: "double", int: 42, default: t );
    std::cout << message << " " << is_big << '\n';
}

questionAnswers(1)

yourAnswerToTheQuestion