public:it:cplusplus:effective_modern_cplusplus

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
public:it:cplusplus:effective_modern_cplusplus [2022/07/11 14:38] – [表] oakfirepublic: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() &;      // this version of doWork applies only when *this is an lvalue 
 + void doWork() &&;     // this version of doWork applies only when *this is an rvalue 
 +};  
 +… 
 +Widget makeWidget();   // factory function (returns rvalue) 
 +Widget w;              // normal object (an lvalue) 
 +w.doWork();            // calls Widget::doWork for lvalues 
 +makeWidget().doWork(); // calls Widget::doWork for rval 
 +</code>
   * ''override'' 修饰词可规避因细微声明差异导致未覆盖。   * ''override'' 修饰词可规避因细微声明差异导致未覆盖。
 ===  » 条目13. 优先使用 const 迭代器 const_iterator === ===  » 条目13. 优先使用 const 迭代器 const_iterator ===
行 246: 行 258:
 === » 条目25 std::move 使用在右值引用,std::forward 使用在通值引用 === === » 条目25 std::move 使用在右值引用,std::forward 使用在通值引用 ===
   * 要利用形参的右值性时,右值引用的形参使用 ''std::move'', 通值引用的形参使用 ''std::forward''   * 要利用形参的右值性时,右值引用的形参使用 ''std::move'', 通值引用的形参使用 ''std::forward''
-  * 一个函数内想多次利用同一个对象的右值性时,只在最后一次使用 ''std::mvoe'', ''std::forward''(因为使用之后该对象就会失效)。+  * 一个函数内想多次利用同一个对象的右值性时,只在最后一次使用 ''std::move'', ''std::forward''(因为使用之后该对象就会失效)。
   * 按值返回的函数要返回右值引用或通值引用时,同样使用 ''std::move'' 或 ''std::forward''   * 按值返回的函数要返回右值引用或通值引用时,同样使用 ''std::move'' 或 ''std::forward''
   * 由于标准规定编译器存在返回值优化(return value optimization,RVO)以及在不优化场景下将 ''std::move'' 隐式应用于返回的局部对象,所以,不需要对要返回的局部对象(或值形参)手动使用 ''std::move'' 或 ''std::forward''   * 由于标准规定编译器存在返回值优化(return value optimization,RVO)以及在不优化场景下将 ''std::move'' 隐式应用于返回的局部对象,所以,不需要对要返回的局部对象(或值形参)手动使用 ''std::move'' 或 ''std::forward''
 +
 +=== » 条目26 避免重载通值引用 ===
 +  * 相比 ''int'' 重载,通值引用的函数会更匹配 ''short'' 参数: <code cpp>
 +template<typename T> void logAndAdd(T&& name){} // origon_func
 +void logAndAdd(int idx){} // overload_func
 +
 +short index;
 +logAndAdd(index); //Error! it match origon_func, not overload_func
 +</code> 通值引用的重载,会让通值引用比预期中更频繁得被调用。
 +   * 完美转发构造函数尤其如此,因为对于非const左值来说,它们通常比复制构造函数(复制构造函数参数声明为const)更匹配,而且它们可以劫持派生子类调用基类的复制与移动构造函数,转而让子类调用完美转发构造函数。
 +=== » 条目27 熟悉「重载通值引用」之外的替代方法 ===
 +
 ==== 翻译对照 ==== ==== 翻译对照 ====
 <WRAP tablewidth 50% > <WRAP tablewidth 50% >
  • public/it/cplusplus/effective_modern_cplusplus.1657521502.txt.gz
  • 最后更改: 2022/07/11 14:38
  • oakfire