[英]Passing vector of unique_ptr with move semantics in c++
我正在学习 CPP++14 移动语义。在编写一小段代码时,我观察到了一些奇怪的行为。 我正在使用 r 值引用将唯一 ptr 的向量移动到函数。 在调试时,我发现更改也应用于移动的对象。 为什么即使物体被移动我也会观察这个hcnage? 以下代码中的移动有什么作用?
void func(std::vector<std::unique_ptr<int>> && vect) {
vect.emplace_back(std::move(std::make_unique<int>(3)));
return ;
}
int main() {
std::vector<std::unique_ptr<int>> a;
func(std::move(a));
cout<<(*(a[0]))<<endl;
return 0;
}
以下代码中的移动有什么作用?
func(std::move(a));
不执行移动操作func(std::move(a));
事实上, std::move
只是执行转换并产生一个右值(xvalue)表达式,它只是绑定到func
的右值引用参数vect
。 然后在func
内对vect
任何修改vect
对参数(即a
)产生影响,它们引用同一个对象。
特别是,
std::move
产生一个 xvalue 表达式来标识它的参数t
。 它完全等同于static_cast
到右值引用类型。
如果您将参数更改为按值传递,那么您将看到执行移动操作。 考虑到你展示的用法,只传递左值引用似乎不那么令人困惑(并且不需要再次在参数上使用std::move
)。
顺便说一句:在vect.emplace_back(std::move(std::make_unique<int>(3)));
std::move
的使用是多余的, std::make_unique<int>(3)
是一个右值表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.