FYI: C ++ 17 Std :: is_invocable_v robi dokładnie to, czego oczekiwałem.

Wyobraź sobie koncepcję, aby sprawdzić, czy wywołanie obciążenia kalkulacyjnego jest możliwe w określonych typach argumentów:

template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args&&... args)
{
    { std::invoke(request, std::forward<Args>(args)...) }-> Status;
};

Przeciw

template <typename Fn, typename... Args>
concept has_request_interface = requires (Fn request, Args... args)
{
    { std::invoke(request, args...) }-> Status;
};

Czy jest to znaczące przy użyciu idealnego przekazywania Wymaga wyrażeń?

Wydaje mi się, że odpowiedź brzmi: tak, ponieważ obiekt żądania może oczekiwać rwalues dla niektórych argumentów.

Ale czy requires (Fn request, Args... args) zachowuje się jako deklarację funkcji dotyczącą natury lvalue args...?

6
JLM 20 styczeń 2020, 21:08

1 odpowiedź

Najlepsza odpowiedź

Zachówi się dokładnie tak, jak wygląda. To rodzaj punktu wyrażenia requires: Aby te rzeczy wyglądały jak C ++. Więc będzie zachowywać się jak C ++.

Liczy się, jak używasz Koncepcja. Oznacza to, że kiedy requires niektóre szablon oparty na nim należy wywołać koncepcję poprawnie. Na przykład:

template<typename Func, typename ...Args
void constrained(Func func, Args &&...args)
  requires has_request_interface<Func, Args...>
{
  Status status = func(std::forward<Args>(args)...);
}

Więc tak, jeśli chcesz przekazać po koncepcji do pracy, koncepcja musi używać && i spedycji.

5
Nicol Bolas 21 styczeń 2020, 03:02