Wie wird std :: is_function implementiert?

82

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 intwäre eine Funktion unter dieser Definition. Was vermisse ich?

Rian Quinn
quelle
10
Denken Sie an das !is_constTeil.
Aschepler
Warum können Funktionstypen nicht const sein? Bezieht sich das auf abscheuliche Typen?
Jtbandes
4
@jtbandes, weil Funktionen eines der wenigen Dinge in C ++ sind, die keine Objekte sind.
Ayxan
1
Ich denke, weil es in gewisser Weise immer
konstant ist
Ich denke, der Titel ist irreführend. "Wie ist das eine gültige std :: is_function Implementierung?" scheint angemessener.
Val sagt Reinstate Monica

Antworten:

73

Lassen Sie uns die Bedingungen so durchgehen, wie sie angezeigt werden:
Wenn const Tnicht const ( constgilt nicht wirklich für Funktionstypen, da Funktionen keine Objekte sind) und Tkeine Referenz ( constgilt 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, weil is_const<const int>::valueist true.

Gemäß C ++ 17 Standard §11.3.5 Funktionen / Abschnitt 7 : (Schwerpunkt Mine)

Der Effekt einer cv-qualifier-seq in einem Funktionsdeklarator ist nicht der gleiche wie das Hinzufügen einer cv-Qualifikation über dem Funktionstyp. Im letzteren Fall werden die Lebenslaufqualifizierer ignoriert. [Hinweis: Ein Funktionstyp mit einem cv-qualifier-seq ist kein cv-qualifizierter Typ. Es gibt keine cv-qualifizierten Funktionstypen. - Endnote] [...]

Ayxan
quelle
5
Ah ... mir fehlte die "const" im is_const-Teil. Das macht Sinn.
Rian Quinn
54

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 Tnicht um einen const-qualifizierten Typ handelt, bedeutet dies, dass es Tsich 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 Typ int(int) constkann nicht durch Hinzufügen einer const-Qualifikation über erhalten werden int(int). Vielmehr gilt das constfür den implizierten Objektparameter.

Brian
quelle