gpt4 book ai didi

c++ - move 构造函数是否需要可 move 的属性?

转载 作者:太空狗 更新时间:2023-10-29 23:49:32 27 4
gpt4 key购买 nike

我正在努力研究 move 构造函数,并希望通过这个问题获得更多见解。这是一个简单的类。

class A
{
private:
vector<B> Bs;
public:
/*
..
*/

A(A&& other)
: Bs
{
Bs = other.Bs;
}
}

即使 B 没有 move 构造函数,我的 move 构造函数看起来是否正确?即使我没有为类 B 的对象显式编写 move 赋值, move 构造函数是否有效?如果不是,是否意味着如果要 move 任何对象,他(她)首先必须确保每个属性也是可 move 的?

最佳答案

如果您的对象包含可 move 的对象(例如 std::vector),则默认 move 构造函数将负责 move ,因此您无需执行任何操作。尝试使用 Rule of Zero .

在您的情况下,不, move 构造函数不会做正确的事情。它会复制,因为在

Bs = other.Bs;

other.Bs 是函数内部的左值,因为它有一个名称(是的,它指的是右值引用,但 other 本身是一个左值)。你需要

Bs = std::move(other.Bs);

或更好

A(A&& other) : Bs(std::move(other.Bs)) {}

但同样,在这种情况下,您真的根本不应该编写任何用户定义的 move 构造函数。

强烈推荐阅读Howard Hinnant ,对 move 语义概念贡献最大的人:http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014

关于c++ - move 构造函数是否需要可 move 的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387180/

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