Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标准::列表::拼接、列表和&;VS list&;_C++_Stl_C++11_Move Semantics - Fatal编程技术网

C++ 标准::列表::拼接、列表和&;VS list&;

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规范也没有提到这个问题。它只提供了两种方法,没有解释差异 您不移动列表本身,也不移动节点(复制它们的指针似乎是将节点从一个列表移动到另一个列表的方式),那么这又有

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

我想知道有什么区别,我更喜欢哪一种

我查看了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之前从临时对象创建一个temp
std::list
变量(感谢注释中的@howardhinent)

此外,如果要从中拼接的列表是临时对象,则不必关心维护其状态。该函数的
&&
版本可能会将列表中的内容撕掉,将地板弄得乱七八糟。这样做可能是为了提高效率(但实际上,
std::list
没有太多理由这样做)

如果你有一个
std::list
其他
,你知道你不会再使用它了,你可以使用
std::move
,主动说“我不管你用它做什么”:

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