Wie ist das Folgende eine Implementierung für std::is_function
?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(aus CPP-Referenz )
Mir scheint, eine int
wäre eine Funktion unter dieser Definition. Was vermisse ich?
!is_const
Teil.Antworten:
Lassen Sie uns die Bedingungen so durchgehen, wie sie angezeigt werden:
Wenn
const T
nicht const (const
gilt nicht wirklich für Funktionstypen, da Funktionen keine Objekte sind) undT
keine Referenz (const
gilt aus demselben Grund auch nicht für Referenzen) Es ist ein Funktionstyp.int
(oder ein anderer Nicht-Funktions-Nicht-Referenz-Typ) würde nicht passen, weilis_const<const int>::value
isttrue
.Gemäß C ++ 17 Standard §11.3.5 Funktionen / Abschnitt 7 : (Schwerpunkt Mine)
quelle
Es gibt nur zwei Kategorien von Typen in der Sprache, die keine konstante Qualifikation haben können: Referenztypen und Funktionstypen. Wenn es sich also
const T
nicht um einen const-qualifizierten Typ handelt, bedeutet dies, dass esT
sich entweder um einen Funktionstyp oder einen Referenztyp handelt. Wenn Sie Referenztypen ausschließen können, bleiben nur Funktionstypen übrig.Man beachte , dass ein Funktionstyp, der einen CV-Kennzeichner trägt, wie zum Beispiel
int(int) const
, ist nicht ein const qualifizierte Typ. Es ist ein Beispiel für einen "abscheulichen Funktionstyp", dessen einzige wirkliche Verwendung darin besteht, Zeiger-zu-Mitglied-Funktionstypen zu komponieren oder zu zerlegen. Der Typint(int) const
kann nicht durch Hinzufügen einer const-Qualifikation über erhalten werdenint(int)
. Vielmehr gilt dasconst
für den implizierten Objektparameter.quelle