mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-26 20:00:27 +08:00
Update item28.md
This commit is contained in:
parent
1b4847b8f8
commit
27ee2c1d6e
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user