Почему общие выражения типа 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';
}