Как следующая реализация для std::is_function
?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(от ссылки CPP )
Мне кажется, int
функция an будет под этим определением. Что мне не хватает?
!is_const
части.Ответы:
Давайте рассмотрим условия в том виде, в котором они отображаются:
если
const T
не является константой (наconst
самом деле не относится к типам функций, поскольку функции не являются объектами), иT
не является ссылкой (const
также не применяется к ссылкам по той же причине) это тип функции.int
(или любой другой тип не-функции-ссылки) не подходит, потому чтоis_const<const int>::value
естьtrue
.В соответствии со стандартом C ++ 17 §11.3.5 Функции / раздел 7 : (Выделение мое)
источник
В языке есть только две категории типов, которые не могут иметь const-квалификации: ссылочные типы и типы функций. Таким образом, если
const T
не может быть константным типом, это означает,T
это либо тип функции, либо ссылочный тип. Если вы можете исключить ссылочные типы, то у вас останутся только типы функций.Обратите внимание, что тип функции, который содержит квалификатор cv, например
int(int) const
, не является константным типом. Это пример «отвратительного типа функции», единственное реальное использование которого состоит в том, чтобы составлять или разлагать типы указателей на функции-члены. Типint(int) const
не может быть получен путем добавления const-квалификации поверхint(int)
. Скорее,const
применяется к подразумеваемому параметру объекта.источник