Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++ 每次复制实现移动赋值的非常量对象时,是否总是获得移动语义?_C++ - Fatal编程技术网

C++ 每次复制实现移动赋值的非常量对象时,是否总是获得移动语义?

C++ 每次复制实现移动赋值的非常量对象时,是否总是获得移动语义?,c++,C++,例如: std::vector<std::pair<std::string, bool > > v; std::pair<std::string, bool> pr; v.push_back( pr ); 只有当函数的参数(在本例中为push_back的参数)为右值时,以及在从函数返回对象时的某些情况下,才会获得移动 在您的示例中,pr不是右值,因此您不会移动它 但是,如果您(例如)将临时对象传递给向量,如下所示: v.push_back(std::pair

例如:

std::vector<std::pair<std::string, bool > > v;
std::pair<std::string, bool> pr;
v.push_back( pr );

只有当函数的参数(在本例中为
push_back
的参数)为右值时,以及在从函数返回对象时的某些情况下,才会获得移动

在您的示例中,
pr
不是右值,因此您不会移动它

但是,如果您(例如)将临时对象传递给向量,如下所示:

v.push_back(std::pair<std::string,bool>());
但是,请注意,在这种情况下,您将无法在调用后以有意义的方式使用
pr
,因为其内容已被移开


(当然,移动的另一个先决条件是您调用的函数实际上接受右值引用。对于vector
push\u-back,确实如此。)

这是重复的吗?好的,所以在我的示例中,如果我想获得移动语义,我必须调用std::move,对吗?是的。请注意,在此之后,您将无法再以有意义的方式使用
pr
(因为它的内容已被移动)。明白了,这很好,因为pr将是堆栈上的一个临时对象,以便传递给另一个函数,并且在完全合理的情况下之后不再使用它。或者,您可能需要考虑将创建临时对象的代码放入一个函数中,比如“代码>配对创建())/>代码>,当它准备就绪时,它只返回<代码> PR/<代码>,然后调用<代码> PuxFuff< <代码>:<代码> v.PuthObjBut后缀(CREATE());<代码>。在这种情况下,您将从函数中移出
pr
并进入向量,而无需使用
std::move
,因为适用于移动对象如何通过值返回的特殊规则。
v.push_back(std::pair<std::string,bool>());
v.push_back(std::move(pr));