Jak wygląda implementacja std::is_function
?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
(z referencji CPP )
Wydaje mi się, int
że w tej definicji byłaby funkcja. czego mi brakuje?
!is_const
części.Odpowiedzi:
Omówmy warunki, jakie się pojawiają:
Jeśli
const T
nie jest const (const
tak naprawdę nie ma zastosowania do typów funkcji, ponieważ funkcje nie są obiektami) iT
nie jest referencją (const
nie dotyczy referencji z tego samego powodu) , to typ funkcji.int
(lub jakikolwiek inny typ niefunkcjonalny-nie-referencyjny) nie pasowałby, ponieważis_const<const int>::value
jesttrue
.Zgodnie ze standardem C ++ 17 § 11.3.5 Funkcje / sekcja 7 : (moje podkreślenie)
źródło
Istnieją tylko dwie kategorie typów w języku, które nie mogą mieć stałej kwalifikacji: typy referencyjne i typy funkcji. Jeśli więc
const T
nie jest typem stałym, oznacza to, żeT
jest albo typem funkcji, albo typem odniesienia. Jeśli możesz wykluczyć typy referencyjne, pozostaną tylko typy funkcji.Zauważ, że typ funkcji, która przenosi kwalifikator cv, taki jak
int(int) const
, nie jest typem o stałej kwalifikacji. Jest to przykład „obrzydliwego typu funkcji”, którego jedynym faktycznym zastosowaniem jest komponowanie lub rozkładanie typów funkcji wskaźnik na element członkowski. Tego typuint(int) const
nie można uzyskać, dodając stałą kwalifikację na górzeint(int)
. Raczejconst
dotyczy to parametru obiektu domyślnego.źródło