我正在努力理解将函数引用作为通用引用传递给函数时到底发生了什么(推断出什么类型)。假设我们有一个函数 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]
这是完全可以理解的:我们将左值传递给我们的函数 foo,因此推导的类型是 void(&)int,而参数的类型将是“void(&& &)int”,在参考折叠规则下变为 void(& )int。Param 将只是对函数的左值引用。
但是当我执行以下操作时:
void(&f)(int) = someFunction;
foo(std::move(f));
foo 将打印:
void foo(T&&) [with T = void (&)int]
这和以前完全一样!这里发生了什么?为什么结果与传递左值时相同?我希望由于我们将右值传递给 foo,推导的类型应该是 T = void(int),而 param 应该是 void(&&)int。这总是发生在所有其他“普通”类型(如类、原始类型等)中。为什么在处理函数引用时会有所不同?