До сих пор я рассматривал прохождение и вызов вызываемого как
template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
g(std::forward<Args>(args)...);
}
это путь. Теперь в этом разговоре (при 34 мин.) И в реализации примера std :: invoke я увидел эквивалент приведенного выше фрагмента, который условно преобразует вызываемый объект в ссылку на rvalue перед вызывая его,
template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
std::forward<Fct>(g)(std::forward<Args>(args)...);
}
Я предполагаю, что эта модификация влияет только на замыкания, но я все еще не понимаю, почему вторая версия предпочтительнее: приведение влияет только на аргументы rvalue, и никакое состояние не должно копироваться при вызове, верно? Я также проверил, перегружены ли std :: function :: operator () на &
и &&
, чтобы получить подсказку библиотеки, альтернативную приведенным выше фрагментам, но это не так.
Заранее спасибо за подсказки и ответы!