How is std::is_function implemented?

C++TemplatesStdSfinae

C++ Problem Overview


How is the following an implementation for std::is_function?

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

(from CPP Reference)

Seems to me, an int would be a function under this definition. What am I missing?

C++ Solutions


Solution 1 - C++

Let's go over the conditions as they appear:
If const T isn't const (const doesn't really apply to function types since functions aren't objects), and T isn't a reference (const doesn't apply to references either for the same reason), it's a function type. int (or any other non-function-non-reference type) wouldn't fit in because is_const<const int>::value is true.

According to C++17 Standard §11.3.5 Functions / section 7: (Emphasis mine)

> The effect of a cv-qualifier-seq in a function declarator is not the > same as adding cv-qualification on top of the function type. In the > latter case, the cv-qualifiers are ignored. [ Note: A function type > that has a cv-qualifier-seq is not a cv-qualified type; there are no > cv-qualified function types. — end note ] [...]

Solution 2 - C++

There are only two categories of types in the language that cannot have const-qualification: reference types, and function types. So, if const T fails to be a const-qualified type, it means T is either a function type or a reference type. If you can rule out reference types, then you are left with only function types.

Note that a function type that carries a cv-qualifier, such as int(int) const, is not a const-qualified type. It's an example of an "abominable function type", whose only real use is to compose or decompose pointer-to-member-function types. The type int(int) const cannot be obtained by adding const-qualification on top of int(int). Rather, the const applies to the implied object parameter.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRian QuinnView Question on Stackoverflow
Solution 1 - C++Ayxan HaqverdiliView Answer on Stackoverflow
Solution 2 - C++Brian BiView Answer on Stackoverflow