【问题标题】:Difference in implementation between two insert() method signatures for std::liststd::list 的两个 insert() 方法签名之间的实现差异
【发布时间】:2018-07-10 03:32:43
【问题描述】:

std::list 的方法 insert() 有 2 个方法签名。一个是这样的 const 左值引用:

iterator insert( const_iterator pos, const T& value );

另一个采用右值引用:

iterator insert( const_iterator pos, T&& value );
  1. 但是我想知道为什么第二个方法签名甚至是必要的?一个 const 左值引用可以绑定到右值。

我知道移动右值可能比复制它们更快。

  1. 但是,采用右值引用的第二个方法签名将如何在 value 上实现与采用 const 左值引用的第一个不同的移动指令?

右值上的赋值运算符将简单地调用移动构造函数,而在左值上它将调用复制构造函数。所以简单地在第一个函数中使用赋值运算符就足够了?

谢谢

【问题讨论】:

  • 第二个签名有一个右值引用,而不是一个通用引用。
  • @n.m.啊,好吧,我编辑了这个问题。但是我的问题仍然存在,第二种方法与第一种方法的实施方式有何不同?由于右值上的赋值运算符将简单地调用移动构造函数,而在左值上它将调用复制构造函数。所以简单地在第一个函数中使用赋值运算符就足够了?

标签: c++ rvalue-reference


【解决方案1】:

首先,这里的T&&不是通用引用,而是一个右值引用,因为T在函数调用的时候并没有被推导出来。在类模板被实例化的那一刻就知道了。

但是我想知道为什么第二个方法签名甚至是必要的?一个 const 左值引用可以绑定到右值。

利用移动语义。取右值引用启用移动操作。

但是,第二个采用右值引用的方法签名将如何对不同于第一个采用 const 左值引用的值执行移动指令?

不同的是:取const左值引用不能移动根本;只有取右值引用才能移动。

【讨论】:

  • 哦,我明白了,所以第一个方法签名将始终调用复制构造函数,即使在第二个方法不存在时会绑定到它的右值上也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2011-09-13
  • 2011-01-18
相关资源
最近更新 更多