gpt4 book ai didi

c++ - 在这种情况下是否会 move 一个值

转载 作者:行者123 更新时间:2023-11-30 01:38:25 30 4
gpt4 key购买 nike

考虑以下片段:

class Bar {...};
class Foo {
public:
Foo(const Bar& bar): bar_(bar) {}
private:
Bar bar_;
};

int main() {
Foo foo({...}); // Passing an rvalue Bar object here.
}

问题:我生成的对象会被复制到 Foo 的构造函数中,还是会被 move ?更准确地说,以下哪项是正确的?

  • 它将始终被复制。
  • 它会一直 move (我很确定不是这样)。
  • 这是未指明的行为。

最佳答案

It will be copied always.

您创建的 rvalue 绑定(bind)到一个 const 左值引用。但即使它绑定(bind)到右值引用,您也可以从左值 (bar) 构造 bar_(bar)。绑定(bind)到引用的对象的值类别没有实际意义,重要的是引用本身的值类别。正如已经提到的,表达式 bar 是一个左值。

作为一般且有些粗略的经验法则,每个作为某物名称的表达式都是左值。

如果你想在一个构造函数中同时支持 move 和复制,前进的方式是:

Foo(Bar bar): bar_(std::move(bar)) {}

现在 bar 可以通过 move 或复制来构造,具体取决于源,并且您的成员是从一个您可以安全地移出的对象构造的。这当然总是会导致额外的 move 。如果你想避免它,那么需要两个 c'tor:

Foo(const Bar& bar): bar_(bar) {}
Foo(Bar&& bar): bar_(std::move(bar)) {}

关于c++ - 在这种情况下是否会 move 一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47900686/

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