4

我正在学习 CPP++14 移动语义。在编写小代码时,我观察到一些奇怪的行为。我正在使用 r 值引用将唯一 ptr 的向量移动到函数中。在调试时,我发现更改也应用于移动的对象。为什么即使物体被移动,我也会观察到这种情况?以下代码中的移动有什么作用?

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

1 回答 1

5

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

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

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

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

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

于 2020-09-04T16:09:55.160 回答