gpt4 book ai didi

c++ - std::list::splice, list&& VS list&

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:04 30 4
gpt4 key购买 nike

std::list 的一些方法,可能还有其他 STL 容器,在 C++11 中添加了一个新的重载。我需要的是 list::splice()。一种方法采用列表&参数,另一种方法采用列表&&参数。

我想知道有什么区别,我应该更喜欢哪个。

我查看了 libstdc++(GCC 编译器使用的标准 C++ 库)的实现,它在两种情况下都在内部使用了 list&& 版本。 C++11 规范也没有说明这个问题。它只提供了 2 种方法,没有解释区别。

您不 move 列表本身,也不 move 节点(复制它们的指针似乎是将节点从一个列表 move 到另一个列表的方法),那么这有什么关系呢?我只有一个想法,也许使用 list&& 就像是对编译器的 promise ,你不再需要另一个列表,编译器可以保存一些操作,因为它不必保持另一个列表有效...

最佳答案

你应该不需要太在意。当您传递的参数是右值时,将选择带有 std::list&& 参数的重载 - 通常当它引用的对象是临时对象时。您无需明确说明要使用哪个重载。

存在这两个版本的函数的原因是为了方便,这样客户端在将临时对象传递给 splice (感谢评论中的@HowardHinnent)。

此外,当您从中拼接的列表是一个临时对象时,没有必要关心维护它的状态。函数的 && 版本可能只是从该列表中撕掉内脏,在地板上留下一团糟。这样做可能是为了提高效率(但实际上,std::list 没有太多理由这样做)。

如果你有一个std::listother,你知道你永远不会再使用,你可以自愿说“我不在乎你用它来做”,通过使用 std::move:

l.splice(pos, std::move(other));

表达式 std::move(other) 是一个右值,因此 splice 函数会将其视为一个临时值。

关于c++ - std::list::splice, list&& VS list&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938048/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com