0

例如:

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) );
4

1 回答 1

1

只有当函数的参数(在本例中为 的参数push_back)是右值时,以及在某些情况下,当您从函数返回对象时,您才会采取行动。

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

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

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

这将是一个右值并触发移动。

您还可以通过按照您建议的方式将参数显式转换为右值来触发移动:

v.push_back(std::move(pr));

但是请注意,在这种情况下,您将无法再以pr有意义的方式在调用后使用,因为其内容已被移走。

(当然,移动的另一个前提条件是您调用的函数实际上接受右值引用。对于向量push_back,确实如此。)

于 2012-11-16T03:15:03.330 回答