Передача ссылки на функцию в качестве универсальной ссылки
Я пытаюсь понять, что именно происходит при передаче ссылки на функцию в качестве универсальной ссылки (какой тип выводится). Предположим, у нас есть функция foo, которая принимает параметр в качестве универсальной ссылки:
template<typename T>
void foo(T&& param)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
И тогда давайте сделаем следующее:
void(&f)(int) = someFunction;
foo(f);
Результатом будет:
void foo(T&&) [with T = void (&)int]
Это совершенно понятно: мы передаем lvalue в нашу функцию foo, поэтому выводимый тип void (&) int, а тип параметра будет «void (&& &) int», который по правилам свертывания ссылок становится void (& ) межд. Param будет просто lvalue ссылкой на функцию.
Но когда я делаю следующее:
void(&f)(int) = someFunction;
foo(std::move(f));
foo напечатает:
void foo(T&&) [with T = void (&)int]
что точно так же, как и раньше! Что здесь происходит? Почему результат такой же, как при прохождении lvalue? Я ожидаю, что, поскольку мы передаем rvalue в foo, выведенный тип должен быть T = void (int), а param должен стать void (&&) int. Это всегда случается со всеми другими «нормальными» типами (такими как классы, примитивные типы и т. Д.). Почему при работе со ссылками на функции это не так?