gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:22 26 4
gpt4 key购买 nike

假设我有一个包含 std::vectorFoo 类,该类由另一个类的 std::unique_ptr 对象构造,

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 的复制构造函数而不是它的移动构造函数?

如果我在 Foo::AddBar 中显式调用 std::move,那么编译问题就会消失,但我不明白为什么需要这样做。我认为这很多余。

那么,我错过了什么?

最佳答案

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

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

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

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

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