#c
#c
Вопрос:
Я видел некоторую реализацию в заголовочном файле <type_traits>, но есть некоторые реализации, которые я не смог найти, например:
// STRUCT TEMPLATE is_class
template <class _Ty>
struct is_class : bool_constant<__is_class(_Ty)> {}; // determine whether _Ty is a class
template <class _Ty>
_INLINE_VAR constexpr bool is_class_v = __is_class(_Ty);
Я хотел бы знать реализацию __is_class .
Кто-нибудь знает, где находится реализация? Я использую среду IDE с именем Visual studio 2019.
Комментарии:
1. Я не слишком знаком с VS, но я подозреваю, что
__is_class
это встроенная функция, распознанная компилятором, которая не имеет определения C . Похоже, это задокументировано на этой странице в документах MS compiler.
Ответ №1:
Эти символы относятся к зарезервированным встроенным токенам, которые распознаются и оцениваются самим компилятором. Компилятор знает, что __is_class
означает, оценивает его для данного типа, а затем использует результаты оценки.
Так получилось, что gcc прекрасно документирует свои встроенные символы здесь (это для gcc 10.2, другие версии gcc имеют практически ту же страницу). РЕДАКТИРОВАТЬ: вот та же страница для VS — судя по всему, почти то же самое.
На этой странице где-нибудь вы найдете __is_class
определение вашей функции для gcc. Другие компиляторы, как правило, заставляют вещи работать одинаково, возможно, изменяя только имена самих символов.
Подводя итог, вы не найдете __is_class
и других, формально определенных ни в одном заголовочном файле. Эти функции, классы и т. Д. встроены в сам компилятор.
Комментарии:
1. В OP упоминалось, что они используют VS2019, поэтому эта страница может быть более подходящей ссылкой для соответствующих встроенных символов.
2. Да, похоже, в основном это одно и то же…