update translation

This commit is contained in:
panda 2019-07-26 11:20:45 +08:00
parent fcc1bb4508
commit 6ff0faceb6

View File

@ -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); //左值处理