在 C++ 中传递具有移动语义的 unique_ptr 向量

ash*_*hal 4 c++ stdvector unique-ptr stdmove

我正在学习 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;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

以下代码中的移动有什么作用?

func(std::move(a));实际上并没有进行移动操作,std::move只是进行了转换,产生了一个右值(xvalue)表达式,该表达式只是绑定到 的右值引用参数vectfunc。然后对vect内部的任何修改也会func影响参数(即a),它们引用同一个对象。

特别是,std::move生成一个 xvalue 表达式来标识其参数t。它完全等同于 astatic_cast到一个右值引用类型。

如果您将参数更改为按值传递,那么您将看到执行移动操作。考虑到您展示的用法,仅传递左值引用似乎不那么令人困惑(并且无需std::move再次使用on 参数)。

BTW:在vect.emplace_back(std::move(std::make_unique<int>(3)));使用中std::move是多余的,std::make_unique<int>(3)是一个右值表达式。

  • @asheshkumarsinghal 如果您按值获取向量,它将被移动。通过引用传递某些内容不会移动它。参考文献只是指原始文献。 (2认同)