К вашему сведению: C ++ 17 std :: is_invocable_v делает именно то, что я ожидал.
Представьте себе концепцию проверки возможности вызова вызываемого объекта с указанными c типами аргументов:
template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args&&... args)
{
{ std::invoke(request, std::forward<Args>(args)...) }-> Status;
};
против
template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args... args)
{
{ std::invoke(request, args...) }-> Status;
};
Имеет ли смысл использование совершенной пересылки в выражениях требует?
Мне кажется, что ответ положительный, потому что вызываемый объект запроса может ожидать значения rvalues для некоторых аргументов.
Но requires (Fn request, Args... args)
ведет себя как объявление функции относительно lvalue природы args...
?