cfa*_*771 5 c++ stl move-semantics c++11
std :: list的一些方法,可能还有其他STL容器,在C++ 11中添加了一个新的重载.我需要的是list :: splice().一种方法采用列表和参数,另一种采用列表&&参数.
我想知道有什么不同,我应该更喜欢哪个.
我查看了libstdc ++(GCC编译器使用的标准C++库)的实现,并在内部使用了两种情况下的list &&版本.此外,C++ 11规范没有提到这个问题.它只提供了两种方法而没有解释差异.
你不移动列表本身,并且你不移动节点(复制它们的指针似乎是将节点从一个列表移动到另一个列表的方式),那么它为什么重要呢?我只有一个想法,也许使用list &&就像对编译器的承诺,你不再需要其他列表,编译器可以保存一些操作,因为它不必保持其他列表有效...
你不应该非常在意.std::list&&当您传递的参数是右值时,将选择带参数的重载- 通常是当它引用的对象是临时对象时.您无需明确说明要使用的重载.
这两个版本的函数存在的原因是为了方便起见,因此客户端std::list在将它传递给splice之前不必从临时对象创建临时变量(感谢评论中的@HowardHinnent).
此外,当你拼接的列表是一个临时对象时,没有必要关心维持它的状态.该&&功能的版本可能只是撕掉该列表中的内容,在整个地板上留下一团糟.这可能是为了提高效率(但实际上,std::list没有太多理由).
如果你有一个std::list,other你知道你永远不会再使用,你可以自愿说"我不在乎你用它做什么",使用std::move:
l.splice(pos, std::move(other));
Run Code Online (Sandbox Code Playgroud)
表达式std::move(other)是一个rvalue,因此该splice函数会将其视为临时表达式.
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |