Comment std :: is_function est-il implémenté?

82

À quoi sert la mise en œuvre suivante std::is_function?

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};

(d'après la référence du RPC )

Il me semble qu'un intserait une fonction selon cette définition. Qu'est-ce que je rate?

Rian Quinn
la source
10
Pensez à la !is_constpartie.
aschepler
Pourquoi les types de fonctions ne peuvent-ils pas être const? Est-ce lié à des types abominables?
jtbandes
4
@jtbandes c'est parce que les fonctions sont l'une des rares choses en C ++ qui ne sont pas des objets.
Ayxan
1
Je suppose que dans un sens, c'est toujours const
RiaD
J'ai l'impression que le titre est trompeur. "Comment est-ce une implémentation std :: is_function valide?" semble plus approprié.
val dit Réintégrer Monica le

Réponses:

73

Passons en revue les conditions telles qu'elles apparaissent:
If const Tn'est pas const ( constne s'applique pas vraiment aux types de fonctions puisque les fonctions ne sont pas des objets), et Tn'est pas une référence ( constne s'applique pas non plus aux références pour la même raison) , c'est un type de fonction. int(ou tout autre type de non-référence non-fonctionnement) ne rentrait pas dans car is_const<const int>::valueest true.

Selon C ++ 17 Standard §11.3.5 Fonctions / section 7 : (Souligner le mien)

L'effet d'un cv-qualifier-seq dans un déclarant de fonction n'est pas le même que l'ajout de cv-qualification au-dessus du type de fonction. Dans ce dernier cas, les qualificatifs cv sont ignorés. [Remarque: Un type de fonction qui a un cv-qualifier-seq n'est pas un type qualifié par cv; il n'y a aucun type de fonction qualifié par cv. - note de fin] [...]

Ayxan
la source
5
Ah .... il me manquait le "const" à l'intérieur de la partie is_const de cela. Ça a du sens.
Rian Quinn
54

Il n'y a que deux catégories de types dans le langage qui ne peuvent pas avoir de const-qualification: les types de référence et les types de fonction. Donc, si const Tne parvient pas à être un type qualifié de const, cela signifie Tsoit un type de fonction soit un type de référence. Si vous pouvez exclure les types de référence, il ne vous reste que des types de fonction.

Notez qu'un type de fonction qui porte un qualificateur cv, tel que int(int) const, n'est pas un type qualifié const. C'est un exemple d'un "type de fonction abominable", dont la seule utilisation réelle est de composer ou de décomposer des types de fonction pointeur-à-membre. Le type int(int) constne peut pas être obtenu en ajoutant const-qualification au-dessus de int(int). Au lieu de cela, le consts'applique au paramètre d'objet implicite.

Brian
la source