Почему общие выражения типа C не могут быть совместимы с C ++?

Кажется, я помню, как слышал расплывчатые комментарии из нескольких надежных источников (то есть членов комитета, выступающих по неофициальным каналам), что выражения общего типа C не будут добавлены в C ++, потому что они не могут быть.

Насколько я могу судить, типовые выражения очень ограничены по сравнению с шаблонами C ++ и их перегрузкой, но нет никакого потенциала для взаимодействия, которое необходимо было бы определить как особый случай.

Типовое выражение состоит из управляющего выражения и серии "ассоциации» между типами и подвыражениями. Подвыражение выбирается на основе статического типа управляющего выражения и типов, перечисленных для подвыражений, и заменяется вместо TGE. Сопоставление основано на концепции совместимости типов C, которая, насколько я могу судить, эквивалентна идентичности C ++ типов сextern связь по правилу единого определения (ODR).

Было бы хорошо, если бы управляющее выражение производного класса выбрало бы связь с базовым классом в C ++, но так как C нетакое наследствоТ необходимо для перекрестной совместимости. В любом случае считается ли это камнем преткновения?

Редактировать: Что касается более конкретных деталей, C11 уже предусматривает сохранение категории значений (lvalue-ness) выбранного подвыражения и, по-видимому, требует, чтобы TGE являлся константным выражением (любой категории), пока все его операнды, включая контролирующее выражение. Вероятно, это дефект языка Си. В любом случае, C ++ 14 определяет константные выражения в терминах того, что может быть потенциально оценено, и спецификация TGE уже говорит, что невыбранные подвыражения не оценены.

Дело в том, что принцип действия TGE кажется достаточно простым, чтобы его можно было пересаживать, не доставляя проблем позже.

Что касаетсяЗачем C ++ TGE 'Было бы полезно, помимо максимального пересечения C и C ++, их можно было бы использовать для реализацииstatic_if, без весьма противоречивой функции условного объявления. Я'я не сторонникstatic_if, но "есть это ".

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

Ответы на вопрос(1)

Ваш ответ на вопрос