¿Cómo es la siguiente implementación std::is_function?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(de la referencia de CPP )
Me parece que una intsería una función bajo esta definición. ¿Qué me estoy perdiendo?

!is_constparte.Respuestas:
Repasemos las condiciones tal como aparecen:
si
const Tno es constante (constrealmente no se aplica a los tipos de función ya que las funciones no son objetos), yTno es una referencia (consttampoco se aplica a las referencias por la misma razón) , es un tipo de función.int(o cualquier otro tipo sin función, sin referencia) no encajaría porqueis_const<const int>::valueestrue.De acuerdo con el estándar C ++ 17 §11.3.5 Funciones / sección 7 : (El énfasis es mío)
fuente
Solo hay dos categorías de tipos en el lenguaje que no pueden tener calificación constante: tipos de referencia y tipos de función. Entonces, si
const Tno puede ser un tipo const, esto significa queTes un tipo de función o un tipo de referencia. Si puede descartar tipos de referencia, solo le quedan tipos de funciones.Tenga en cuenta que un tipo de función que lleva un calificador cv, como por ejemplo
int(int) const, no es un tipo calificado const. Es un ejemplo de un "tipo de función abominable", cuyo único uso real es componer o descomponer los tipos de función de puntero a miembro. El tipoint(int) constno se puede obtener agregando const-qualification encima deint(int). Más bien, seconstaplica al parámetro del objeto implícito.fuente