C++ 标准::列表::拼接、列表和&;VS list&;
std::list的一些方法,可能还有其他STL容器,在C++11中添加了一个新的重载。我需要的是list::splice()。一个方法获取列表和参数,另一个方法获取列表和参数 我想知道有什么区别,我更喜欢哪一种C++ 标准::列表::拼接、列表和&;VS list&;,c++,stl,c++11,move-semantics,C++,Stl,C++11,Move Semantics,std::list的一些方法,可能还有其他STL容器,在C++11中添加了一个新的重载。我需要的是list::splice()。一个方法获取列表和参数,另一个方法获取列表和参数 我想知道有什么区别,我更喜欢哪一种 我查看了LBSTDC + +(GCC编译器使用的标准C++库)的实现,并在内部使用了两种情况下的列表和版本。另外,C++11规范也没有提到这个问题。它只提供了两种方法,没有解释差异 您不移动列表本身,也不移动节点(复制它们的指针似乎是将节点从一个列表移动到另一个列表的方式),那么这又有
我查看了LBSTDC + +(GCC编译器使用的标准C++库)的实现,并在内部使用了两种情况下的列表和版本。另外,C++11规范也没有提到这个问题。它只提供了两种方法,没有解释差异
您不移动列表本身,也不移动节点(复制它们的指针似乎是将节点从一个列表移动到另一个列表的方式),那么这又有什么关系呢?我只有一个想法,也许使用list&&就像是向编译器承诺不再需要另一个列表,编译器可以保存一些操作,因为它不必保持另一个列表有效…左值引用绑定到左值,右值引用绑定到右值:
tyedef std::list<Foo> lt;
lt make_list();
int main()
{
lt x;
lt tmp = make_list();
x.splice(tmp); // needs '&'
x.splice(make_list()); // needs '&&'
}
tyedef std::list lt;
lt make_list();
int main()
{
lt-x;
lt tmp=制作列表();
x、 拼接(tmp);//需要“&”
x、 拼接(make_list());//需要“&&”
}
你不需要太在意。当传递的参数是右值时,通常当它引用的对象是临时对象时,将选择带有std::list&
参数的重载。您不需要明确说明要使用哪个重载
这两个版本函数存在的原因是为了方便,这样客户端就不必在将临时对象传递给splice之前从临时对象创建一个tempstd::list
变量(感谢注释中的@howardhinent)
此外,如果要从中拼接的列表是临时对象,则不必关心维护其状态。该函数的&&
版本可能会将列表中的内容撕掉,将地板弄得乱七八糟。这样做可能是为了提高效率(但实际上,std::list
没有太多理由这样做)
如果你有一个std::list
,其他
,你知道你不会再使用它了,你可以使用std::move
,主动说“我不管你用它做什么”:
l.splice(pos, std::move(other));
表达式std::move(other)
是一个右值,因此splice
函数将其视为临时值