Вам необходимо удалить ссылку на 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.