【发布时间】:2015-09-16 11:49:48
【问题描述】:
我很难理解将函数引用作为通用引用传递给函数时到底发生了什么(推导什么类型)。假设我们有一个函数 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”,在引用折叠规则下变为无效(&)整数。 Param 将只是对函数的左值引用。
但是当我执行以下操作时:
void(&f)(int) = someFunction;
foo(std::move(f));
foo 将打印:
void foo(T&&) [with T = void (&)int]
这和以前完全一样!这里发生了什么?为什么结果与传递左值时相同?我希望由于我们将 rvalue 传递给 foo,推导的类型应该是 T = void(int),param 应该成为 void(&&)int。这总是发生在所有其他“正常”类型(如类、原始类型等)中。为什么在处理函数引用时会有所不同?
【问题讨论】:
-
不。
param有一个名字,根据定义它是一个左值。 -
@KerrekSB 抱歉,这是错误的 - stackoverflow.com/questions/7016777/…
-
@rubix_addict:我的错,谢谢!已移除。我追求的是答案的一部分,但我没有做对。
标签: c++ c++11 universal-reference