mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-29 21:30:31 +08:00
update translation
This commit is contained in:
parent
fcc1bb4508
commit
6ff0faceb6
@ -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); //左值处理
|
||||
|
Loading…
Reference in New Issue
Block a user