例如:
std::vector<std::pair<std::string, bool > > v;
std::pair<std::string, bool> pr;
v.push_back( pr );
假设std::pair
已经定义了一个移动赋值运算符。对 v.push_back 的调用会自动使用移动分配,还是我需要像这样专门要求它?
v.push_back( std::move(pr) );
例如:
std::vector<std::pair<std::string, bool > > v;
std::pair<std::string, bool> pr;
v.push_back( pr );
假设std::pair
已经定义了一个移动赋值运算符。对 v.push_back 的调用会自动使用移动分配,还是我需要像这样专门要求它?
v.push_back( std::move(pr) );
只有当函数的参数(在本例中为 的参数push_back
)是右值时,以及在某些情况下,当您从函数返回对象时,您才会采取行动。
在您的示例中,pr
它不是右值,因此您不会移动它。
但是,如果您——例如——将一个临时对象传递给向量,如下所示:
v.push_back(std::pair<std::string,bool>());
这将是一个右值并触发移动。
您还可以通过按照您建议的方式将参数显式转换为右值来触发移动:
v.push_back(std::move(pr));
但是请注意,在这种情况下,您将无法再以pr
有意义的方式在调用后使用,因为其内容已被移走。
(当然,移动的另一个前提条件是您调用的函数实际上接受右值引用。对于向量push_back
,确实如此。)