Як реалізується std :: is_function?


82

Як здійснюється наступна реалізація std::is_function?

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

(із довідки CPP )

Мені здається, intфункція під цим визначенням була б функцією. Що я пропускаю?


10
Подумайте про !is_constчастину.
асчеплер

Чому типи функцій не можуть бути const? Це пов’язано з гидотними типами?
jtbandes

4
@jtbandes це тому, що функції є однією з небагатьох речей у C ++, які не є об’єктами.
Айксан

1
Я думаю, тому що в певному сенсі це завжди const
RiaD

Я відчуваю, що назва вводить в оману. "Як це дійсна версія std :: is_function?" видається більш підходящим.
Вал каже Відновити Моніку

Відповіді:


73

Перегляньмо умови, як вони з'являються:
Якщо const Tне const ( constне дійсно стосується типів функцій, оскільки функції не є об'єктами), і Tне є посиланням ( constне застосовується до посилань з тієї ж причини) , це тип функції. int(або будь-який інший нефункціональний тип, який не посилається) не вписується, оскільки is_const<const int>::valueє true.

Відповідно до C ++ 17 стандарту §11.3.5 Функції / розділ 7 : (Наголос міни)

Ефект cv-kvalifier-seq в деклараторі функції не такий, як додавання cv-кваліфікації поверх типу функції. В останньому випадку ідентифікатори cv-класифікаторів ігноруються. [Примітка: Тип функції, що має cv-kvalifier-seq, не є типом cv-кваліфікації; не існує типів функцій, визначених cv. - кінцева примітка] [...]


5
Ах .... Я бракував "const" всередині is_const частини цього. Що має сенс.
Rian Quinn

54

У мові є лише дві категорії типів, які не можуть мати const-кваліфікації: типи посилань та типи функцій. Отже, якщо це const Tне кваліфікований тип const, це означає, що Tце або тип функції, або тип посилання. Якщо ви можете виключати типи посилань, вам залишаються лише типи функцій.

Зауважте, що тип функції, що містить cv-класифікатор, наприклад int(int) const, не є типом , призначеним для const. Це приклад "непристойного типу функцій", єдине реальне використання якого - складати або розкладати типи функцій вказівника до члена. Тип int(int) constнеможливо отримати, додавши const-кваліфікацію поверх int(int). Скоріше, це constстосується параметра параметр об'єкта.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.