Предположим, у меня есть функтор присваивающего состояния. Цедент будет использоваться повторно несколько раз, поэтому он должен копировать значение каждый раз. Однако, если присваиватель является r-значением, он может просто переместить значение:
struct Assignor {
std::string value;
void operator()(std::string& dest) const &
{
dest = value;
}
void operator()(std::string& dest) &&
{
dest = std::move(value);
}
};
Теперь, идеальная пересылка имеет значение для значений r:
Assignor f{std::string(10000, 'X')};
std::string a, b, c;
time_function(f, a); // copies the string
time_function(std::move(f), b); // should move the string
// but copies if you don't std::forward
time_function(Assignor{std::string(10000, 'Y')}, c); // same
(Это только примеро том, как функтор может быть оптимизирован по категории значения. Я знаю, что это выглядит несколько искусственно, но люди всегда приходят с творческими идеями.)
Кстати, вы должны использовать std::invoke
вместо прямого вызова ()
:
std::invoke(std::forward<T>(func), std::forward<U>(args)...);