Почему `std :: is_function_v` не работает должным образом? - PullRequest
0 голосов
/ 10 сентября 2018
#include <iostream>
#include <type_traits>
#include <iomanip>

using namespace std;

template<typename T>
bool f(T&& v)
{
    return is_function_v<decltype(forward<T>(v))>;
}

int main()
{
    cout << boolalpha
        << is_function_v<decltype(setw)>
        << endl;

    cout << boolalpha
        << f(setw)
        << endl;

    return 0;
}

Outout: (clang 6.0 & gcc 8.0)

>

верно

ложь

Но ожидаемый результат должен быть:

>

верно

правда

Почему std::is_function_v не работает должным образом?

1 Ответ

0 голосов
/ 10 сентября 2018

Вам необходимо удалить ссылку на T.

template<typename T>
bool f(T&& v)
{
    return is_function_v<remove_reference_t<decltype(forward<T>(v))>>;
    //                   ~~~~~~~~~~~~~~~~~~
}

Когда передано от setw до f, это lvalue, тогда ссылочный тип переадресации T будет выведен как lvalue ссылка на функцию. Для std::is_function ссылки на функции (и указатели на функции и т. Д.) Не считаются типами функций.


КСТАТИ: тип ссылки на пересылку T будет выводиться как ссылка lvalue или ссылка rvalue; и использование decltype на std::forward всегда будет давать ссылочный тип, либо ссылку lvalue, либо ссылку rvalue.

...