From 27ee2c1d6e283951d7688f16b0d9d7b97693ba17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=AB=E8=80=B3=E5=A0=80=E5=B7=9D=E9=9B=B7=E9=BC=93?= <58223265+neko-horikawaraiko@users.noreply.github.com> Date: Mon, 15 Mar 2021 20:03:01 +0800 Subject: [PATCH] Update item28.md --- 5.RRefMovSemPerfForw/item28.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5.RRefMovSemPerfForw/item28.md b/5.RRefMovSemPerfForw/item28.md index bab98ca..1e35547 100644 --- a/5.RRefMovSemPerfForw/item28.md +++ b/5.RRefMovSemPerfForw/item28.md @@ -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`,`std::forward`实现中把`T`换为`Widget`得到: +现在假设一下,传递给`f`的实参是一个`Widget`的右值。在这个例子中,`f`的类型参数`T`的推导类型就是`Widget`。`f`内部的`std::forward`调用因此为`std::forward`,`std::forward`实现中把`T`换为`Widget`得到: ```cpp Widget&& forward(typename