我正在努力理解将参考函数作为通用参考传递给函数时会发生什么(正在推导哪种类型)。让我们假设我们有一个函数foo接受一个PARAM作为通用参考:将参考函数作为通用参考传递
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”,其参考折叠规则变为无效(&)int。参数将只是一个函数的左值引用。
但是,当我做到以下几点:
void(&f)(int) = someFunction;
foo(std::move(f));
foo将打印:
void foo(T&&) [with T = void (&)int]
这也正是像以前一样!这里发生了什么?为什么结果与传递左值相同?我期望,因为我们传递右值到foo,所推导的类型应该是T = void(int),并且参数应该变为void(int323)。对于所有其他“常规”类型(如类,基本类型等),这总是会发生。为什么在处理函数引用时它有所不同?
Nah。 'param'有一个名字,根据定义它是一个左值。 –
@KerrekSB抱歉,这是错误的 - http:// stackoverflow。com/questions/7016777/what-is-rvalue-reference-to-function-type –
@rubix_addict:我的不好,谢谢!删除。我是在声明之后,这是答案的一部分,但我没有把它说清楚。 –