¿Cómo se implementa std :: is_function?

82

¿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?

Rian Quinn
fuente
10
Piensa en la !is_constparte.
Aschepler
¿Por qué los tipos de función no pueden ser constantes? ¿Está relacionado con tipos abominables?
jtbandes
44
@jtbandes es porque las funciones son una de las pocas cosas en C ++ que no son objetos.
Ayxan
1
Supongo que porque en cierto sentido siempre es constante
RiaD
Siento que el título es engañoso. "¿Cómo es una implementación std :: is_function válida?" Parece más apropiado.
Val dice reinstalar a Mónica el

Respuestas:

73

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), y Tno 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 porque is_const<const int>::valuees true.

De acuerdo con el estándar C ++ 17 §11.3.5 Funciones / sección 7 : (El énfasis es mío)

El efecto de un cv-qualifier-seq en un declarador de funciones no es lo mismo que agregar cv-qualification sobre el tipo de función. En el último caso, los calificadores cv se ignoran. [Nota: Un tipo de función que tiene un cv-qualifier-seq no es un tipo calificado por cv; no hay tipos de funciones calificadas por cv. - nota final] [...]

Ayxan
fuente
55
Ah ... me faltaba el "const" dentro de la parte is_const de esto. Eso tiene sentido.
Rian Quinn
54

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 que Tes 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 tipo int(int) constno se puede obtener agregando const-qualification encima de int(int). Más bien, se constaplica al parámetro del objeto implícito.

Brian
fuente