Передача ссылки на функцию в качестве универсальной ссылки

Я пытаюсь понять, что именно происходит при передаче ссылки на функцию в качестве универсальной ссылки (какой тип выводится). Предположим, у нас есть функция 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. Это всегда случается со всеми другими «нормальными» типами (такими как классы, примитивные типы и т. Д.). Почему при работе со ссылками на функции это не так?

Ответы на вопрос(1)

Ваш ответ на вопрос