gpt4 book ai didi

c++ - 为什么这需要一个显式的 std::move?

转载 作者:IT老高 更新时间:2023-10-28 22:32:58 28 4
gpt4 key购买 nike

假设我有一个 Foo包含 std::vector 的类由 std::unique_ptr build 另一个类的对象,Bar .

typedef std::unique_ptr<Bar> UniqueBar;

class Foo {
std::vector<UniqueBar> bars;
public:
void AddBar(UniqueBar&& bar);
};

void Foo::AddBar(UniqueBar&& bar) {
bars.push_back(bar);
}

这会导致编译错误(在 g++ 4.8.1 中)说 std::unique_ptr 的复制构造函数被删除,这是合理的。这里的问题是,既然 bar 参数已经是一个右值引用,为什么 std::unique_ptr 的复制构造函数被调用而不是它的移动构造函数?

如果我明确调用 std::moveFoo::AddBar然后编译问题就消失了,但我不明白为什么需要这样做。我认为这很多余。

那么,我错过了什么?

最佳答案

基本上,每个有名字的对象都是一个左值。当您使用右值引用将对象传递给函数时,该函数实际上会看到一个左值:它被命名。然而,右值引用的作用是表明它来自一个准备好被传输的对象。

换句话说,右值引用是不对称的:

  • 它们只能接收右值,即临时对象、即将消失的对象或看起来像是右值的对象(例如,std::move(o) 的结果)
  • 然而,右值引用本身看起来像一个左值

关于c++ - 为什么这需要一个显式的 std::move?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21321145/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com