差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| public:it:cplusplus:effective_modern_cplusplus [2022/07/11 14:38] – [表] oakfire | public:it:cplusplus:effective_modern_cplusplus [2024/11/06 15:51] (当前版本) – [章节5. 右值引用、移动语义和完美转发] oakfire | ||
|---|---|---|---|
| 行 101: | 行 101: | ||
| === » 条目12. 声明覆盖函数时,使用修饰词 override === | === » 条目12. 声明覆盖函数时,使用修饰词 override === | ||
| * 区分覆盖和重载的区别。 | * 区分覆盖和重载的区别。 | ||
| - | * c++11 比 c++98 对虚函数覆盖多了一条限定:覆盖函数的引用限定词必须与基类相同。 | + | * c++11 比 c++98 对虚函数覆盖多了一条限定:覆盖函数的引用限定词必须与基类相同。<code cpp> |
| + | class Widget { | ||
| + | public: | ||
| + | … | ||
| + | void doWork() &; | ||
| + | void doWork() &&; | ||
| + | }; | ||
| + | … | ||
| + | Widget makeWidget(); | ||
| + | Widget w; // normal object (an lvalue) | ||
| + | w.doWork(); | ||
| + | makeWidget().doWork(); | ||
| + | </ | ||
| * '' | * '' | ||
| === » 条目13. 优先使用 const 迭代器 const_iterator === | === » 条目13. 优先使用 const 迭代器 const_iterator === | ||
| 行 246: | 行 258: | ||
| === » 条目25 std::move 使用在右值引用,std:: | === » 条目25 std::move 使用在右值引用,std:: | ||
| * 要利用形参的右值性时,右值引用的形参使用 '' | * 要利用形参的右值性时,右值引用的形参使用 '' | ||
| - | * 一个函数内想多次利用同一个对象的右值性时,只在最后一次使用 '' | + | * 一个函数内想多次利用同一个对象的右值性时,只在最后一次使用 '' |
| * 按值返回的函数要返回右值引用或通值引用时,同样使用 '' | * 按值返回的函数要返回右值引用或通值引用时,同样使用 '' | ||
| * 由于标准规定编译器存在返回值优化(return value optimization,RVO)以及在不优化场景下将 '' | * 由于标准规定编译器存在返回值优化(return value optimization,RVO)以及在不优化场景下将 '' | ||
| + | |||
| + | === » 条目26 避免重载通值引用 === | ||
| + | * 相比 '' | ||
| + | template< | ||
| + | void logAndAdd(int idx){} // overload_func | ||
| + | |||
| + | short index; | ||
| + | logAndAdd(index); | ||
| + | </ | ||
| + | * 完美转发构造函数尤其如此,因为对于非const左值来说,它们通常比复制构造函数(复制构造函数参数声明为const)更匹配,而且它们可以劫持派生子类调用基类的复制与移动构造函数,转而让子类调用完美转发构造函数。 | ||
| + | === » 条目27 熟悉「重载通值引用」之外的替代方法 === | ||
| + | |||
| ==== 翻译对照 ==== | ==== 翻译对照 ==== | ||
| <WRAP tablewidth 50% > | <WRAP tablewidth 50% > | ||