【发布时间】:2016-12-19 05:40:42
【问题描述】:
当我阅读Effective Modern C++ by Scott Meyer 关于 std::forward 函数如何工作的内容时,我遇到了一个我不太明白的问题。假设我们有一个函数foo,如下所示:
template<typename T>
void foo(T&& fooParam)
{
...
someFunc(std::forward<T>(fooParam));
}
在书中,Scott 解释说 std::forward<T> 可以通过以下方式实现:
template<typename T>
T&& forward(typename remove_reference<T>::type& param)
{
return static_cast<T&&>(param);
}
假设传递给foo 的参数是Widget 类型的右值。然后std::forward函数模板会这样初始化:
Widget&& forward(Widget& param)
{ return static_cast<Widget&&>(param); }
所以我的问题是,当fooParam(Widget && 类型)传递给std::forward 时,接受Widget& param 类型参数的函数如何匹配fooParam?我知道fooParam 本身就是一个左值。但它的类型仍然是右值引用 (Widget &&) 对吧?他们怎么可能互相匹配?
如果一个接受左值引用类型参数的函数可以通过右值引用传递,那么这个函数可以做任何它想做的事情,甚至修改传入的右值(如临时对象)。这对我来说没有意义......
【问题讨论】:
-
它的调用方应该关注传递 rvales 的含义。如果将右值传递给函数,则函数的调用者不应进一步使用它。但是,接收右值的函数只是将参数视为正常值。
标签: function c++11 rvalue-reference