¿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 int
sería una función bajo esta definición. ¿Qué me estoy perdiendo?
!is_const
parte.Respuestas:
Repasemos las condiciones tal como aparecen:
si
const T
no es constante (const
realmente no se aplica a los tipos de función ya que las funciones no son objetos), yT
no es una referencia (const
tampoco 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>::value
estrue
.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 T
no puede ser un tipo const, esto significa queT
es 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) const
no se puede obtener agregando const-qualification encima deint(int)
. Más bien, seconst
aplica al parámetro del objeto implícito.fuente