From 6ff0faceb675e51289be70b07955e139151a39eb Mon Sep 17 00:00:00 2001 From: panda Date: Fri, 26 Jul 2019 11:20:45 +0800 Subject: [PATCH] update translation --- .../item23.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5.RvalueReferences_MovingSemantics_And_PerfectForwarding/item23.md b/5.RvalueReferences_MovingSemantics_And_PerfectForwarding/item23.md index 28a697d..4513248 100644 --- a/5.RvalueReferences_MovingSemantics_And_PerfectForwarding/item23.md +++ b/5.RvalueReferences_MovingSemantics_And_PerfectForwarding/item23.md @@ -40,7 +40,7 @@ move(T&& param) } ``` -我为你们高亮了这段代码的两部分(译者注:markdown不支持代码段内高亮。高亮的部分为`move`和`static_cast`)。一个是函数名字,因为函数的返回值非常具有干扰性。而且我不想你们被它搞得晕头转向。另外一个高亮的部分是包含这段函数的本质的转换。正如你所见,`std::move`接受一个对象的引用(准确的说,一个万能应用(universal reference),后见Item 24),返回一个指向同对象的引用。 +我为你们高亮了这段代码的两部分(译者注:markdown不支持代码段内高亮。高亮的部分为`move`和`static_cast`)。一个是函数名字,因为函数的返回值非常具有干扰性。而且我不想你们被它搞得晕头转向。另外一个高亮的部分是包含这段函数的本质的转换。正如你所见,`std::move`接受一个对象的引用(准确的说,一个通用引用(universal reference),后见Item 24),返回一个指向同对象的引用。 该函数返回类型的`&&`部分表明`std::move`函数返回的是一个右值引用,但是,正如Item 28所解释的那样,如果类型`T`恰好是一个左值引用,那么`T&&`将会成为一个左值引用。为了避免如此,类型萃取器(type trait,见Item 9)`std::remove_reference`应用到了类型`T`上,因此确保了`&&`被正确的应用到了一个不是引用的类型上。这保证了`std::move`返回的真的是右值引用,这很重要,因为函数返回的右值引用是右值(rvalues)。因此,`std::move`将它的参数转换为一个右值,这就是它的全部作用。 @@ -115,7 +115,7 @@ class string { //std::string事实上是 从这个例子中,可以总结出两点。第一,不要在你希望能移动对象的时候,声明他们为常量。对常量对象的移动请求会悄无声息的被转化为复制操作。第二点,`std::move`不仅不移动任何东西,而且它也不保证它执行转换的对象可以被移动。关于`std::move`,你能确保的唯一一件事就是将它应用到一个对象上,你能够得到一个右值。 关于`std::forward`的故事与`std::move`是相似的,但是与`std::move`总是**无条件**的将它的参数转换为右值不同,`std::forward`只有在满足一定条件的情况下才执行转换。`std::forward`是**有条件**的转换。要明白什么时候它执行转换,什么时候不,想想`std::forward`的典型用法。 -最常见的情景是一个模板函数,接收一个万能引用参数(universal reference parameter),并将它传递给另外的函数: +最常见的情景是一个模板函数,接收一个通用引用参数(universal reference parameter),并将它传递给另外的函数: ```cpp void process(const Widget& lvalArg); //左值处理