Come viene implementato std :: is_function?


82

Come è la seguente un'implementazione per std::is_function ?

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

(a partire dal riferimento CPP )

Mi sembra che intsarebbe una funzione in base a questa definizione. Cosa mi sto perdendo?


10
Pensa alla !is_constparte.
aschepler

Perché i tipi di funzione non possono essere const? È legato a tipi abominevoli?
jtbandes

4
@jtbandes è perché le funzioni sono una delle poche cose in C ++ che non sono oggetti.
Ayxan

1
Immagino perché in un certo senso è sempre costante
RiaD

Sento che il titolo è fuorviante. "In che modo è un'implementazione std :: is_function valida?" sembra più appropriato.
dice Val Reinstate Monica l'

Risposte:


73

Esaminiamo le condizioni come appaiono:
se const Tnon è const ( constnon si applica realmente ai tipi di funzione poiché le funzioni non sono oggetti) e Tnon è un riferimento ( constnon si applica nemmeno ai riferimenti per lo stesso motivo) , è un tipo di funzione. int(o qualsiasi altro tipo non di riferimento non funzionale) non si adatterebbe perché lo is_const<const int>::valueè true.

Secondo la norma C ++ 17 §11.3.5 Funzioni / sezione 7 : (Enfasi mia)

L'effetto di un qualificatore cv in un dichiaratore di funzione non è lo stesso dell'aggiunta della qualifica cv in cima al tipo di funzione. In quest'ultimo caso, i qualificatori cv vengono ignorati. [Nota: un tipo di funzione che ha un qualificatore cv-seq non è un tipo qualificato cv; non ci sono tipi di funzione qualificati per cv. - fine nota] [...]


5
Ah .... Mi mancava la "const" all'interno della parte is_const di questo. Questo ha senso.
Rian Quinn,

54

Esistono solo due categorie di tipi nella lingua che non possono avere la qualifica const: tipi di riferimento e tipi di funzione. Quindi, se const Tnon riesce a essere un tipo qualificato const, significa che Tè un tipo di funzione o un tipo di riferimento. Se riesci a escludere i tipi di riferimento, ti rimarranno solo i tipi di funzione.

Si noti che un tipo di funzione che porta un qualificatore cv, come ad esempio int(int) const, non è un tipo con qualifica const. È un esempio di un "tipo di funzione abominevole", il cui unico uso reale è comporre o decomporre i tipi di funzione puntatore-membro. Il tipo int(int) constnon può essere ottenuto aggiungendo la qualifica const in cima a int(int). Piuttosto, si constapplica al parametro dell'oggetto implicito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.