Я, кажется, вспоминаю смутные комментарии нескольких достоверных источников (т. Е. Членов комитета, выступающих в неофициальных каналах), что выражающие C-типы выражения не будут добавлены в C++, потому что их не может быть.Почему C-образные выражения типа C не совместимы с C++?
Насколько я могу судить, типовые выражения очень ограничены по сравнению с шаблонами C++ и перегрузкой, но нет никакого потенциала для взаимодействия, которое необходимо было бы определить как частный случай.
Типичное выражение состоит из управляющего выражения и ряда «ассоциаций» между типами и подвыражениями. Подвыражение выбирается на основе статического типа управляющего выражения и типов, перечисленных для подвыражений, и вместо ТЭГ заменяется. Согласование основано на концепции совместимости типов C, которая, насколько я могу судить, эквивалентна идентичности типов C++ типов с привязкой extern
в соответствии с правилом определения (ODR).
Было бы неплохо, если бы выражение, определяющее производный класс, выбрало бы ассоциацию базового класса в C++, но поскольку C не имеет наследования, такая тонкость не нужна для кросс-совместимости. В любом случае, считается ли это камнем преткновения?
Edit: Что касается более конкретных деталей, C11 уже предусматривает сохранение категории стоимости (именующий-Ness) выбранное подвыражения, и, кажется, требует, чтобы TGE является постоянным выражением (в каком бы категории) до тех пор, как и все его операнды, включая контрольное выражение. Вероятно, это дефект языка C. В любом случае, C++ 14 определяет постоянные выражения с точки зрения потенциальной оценки, а спецификация TGE уже говорит о том, что невыбранные подвыражения не оцениваются.
Дело в том, что принцип работы TGE кажется достаточно простым, чтобы его можно было пересаживать, даже не вызывая проблемы позже.
Что касается почему C++ TGE был бы полезно, помимо максимизации пересечения C и C++, они могут быть использованы для реализации по существу static_if
, SANS весьма спорной условной функции декларации. Я не сторонник 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';
}
Возможно, дело в том, что решение об общем рождении должно прийти перед тем, что определяет, как работают классы. Таким образом, вы не сможете генерировать классы, и, следовательно, у вас будет функция, которая работает только с некоторыми типами. – leewz
@leewangzhong Ну, это будет работать так же, как в C.Он будет работать на всех типах, просто не с пониманием наследования. – Potatoswatter
Я имею в виду, возможно, типы C++ не распознаются к моменту, когда генерические средства будут разрешены. – leewz