À 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 int
serait une fonction selon cette définition. Qu'est-ce que je rate?
!is_const
partie.Réponses:
Passons en revue les conditions telles qu'elles apparaissent:
If
const T
n'est pas const (const
ne s'applique pas vraiment aux types de fonctions puisque les fonctions ne sont pas des objets), etT
n'est pas une référence (const
ne 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 caris_const<const int>::value
esttrue
.Selon C ++ 17 Standard §11.3.5 Fonctions / section 7 : (Souligner le mien)
la source
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 T
ne parvient pas à être un type qualifié de const, cela signifieT
soit 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 typeint(int) const
ne peut pas être obtenu en ajoutant const-qualification au-dessus deint(int)
. Au lieu de cela, leconst
s'applique au paramètre d'objet implicite.la source