Update item28.md

This commit is contained in:
猫耳堀川雷鼓 2021-03-15 20:03:01 +08:00 committed by GitHub
parent 1b4847b8f8
commit 27ee2c1d6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -70,7 +70,7 @@ void f(T&& fParam)
}
```
因为`fParam`是通用引用,我们知道类型参`T`的类型根据`f`被传入实参(即用来实例化`fParam`的表达式)是左值还是右值来编码。`std::forward`的作用是当且仅当传给`f`的实参为右值时,即`T`为非引用类型,才将`fParam`(左值)转化为一个右值。
因为`fParam`是通用引用,我们知道类型参`T`的类型根据`f`被传入实参(即用来实例化`fParam`的表达式)是左值还是右值来编码。`std::forward`的作用是当且仅当传给`f`的实参为右值时,即`T`为非引用类型,才将`fParam`(左值)转化为一个右值。
`std::forward`可以这样实现:
@ -109,7 +109,7 @@ Widget& forward(Widget& param)
正如你所看到的,当左值实参被传入到函数模板`f`时,`std::forward`被实例化为接受和返回左值引用。内部的转换不做任何事,因为`param`的类型已经是`Widget&`,所以转换没有影响。左值实参传入`std::forward`会返回左值引用。通过定义,左值引用就是左值,因此将左值传递给`std::forward`会返回左值,就像期待的那样。
现在假设一下,传递给`f`的实参是一个`Widget`的右值。在这个例子中,`f`的类型参`T`的推导类型就是`Widget`。`f`内部的`std::forward`调用因此为`std::forward<Widget>``std::forward`实现中把`T`换为`Widget`得到:
现在假设一下,传递给`f`的实参是一个`Widget`的右值。在这个例子中,`f`的类型参`T`的推导类型就是`Widget`。`f`内部的`std::forward`调用因此为`std::forward<Widget>``std::forward`实现中把`T`换为`Widget`得到:
```cpp
Widget&& forward(typename