gpt4 book ai didi

c++ - 参数类没有 move 构造函数时IDE推荐 'pass by value and use std move'

转载 作者:行者123 更新时间:2023-12-05 01:53:09 24 4
gpt4 key购买 nike

struct Person
{
int mId;
std::string mName;

Person(int id, std::string name) : mId(id), mName(std::move(name))
{
}
};

struct Node
{
Person mData;
Node* mLeft;
Node* mRight;

Node(Person data) : mData(std::move(data)), mLeft(nullptr), mRight(nullptr)
{}
};

在为我的 Person 类编写构造函数时,我最初将我的“名称”参数定义为常量引用,但建议将其更改为简单值并使用 std move

我理解这是因为右值字符串可用于初始化“Person”,在这种情况下,字符串将被 move 到变量“name”中,而不是被复制。然后它将通过 std::move 进一步 move 到成员变量“mName”中。我也觉得这只适用于 std::string 因为它定义了一个 move 构造函数。

不明白的是为什么建议我在“节点”类构造函数中再次使用 std::move,因为我没有为 Person 定义 move 构造函数。此外,我注意到从 Person 类中删除字符串成员变量 mName 会停止此 IDE 推荐。

我猜这是因为 Person 类的默认 move 构造函数。

(如果有帮助,我的 IDE 是 VS2022,推荐来自扩展 Resharper')

最佳答案

您的 Person 类遵循“零规则”,这意味着它没有明确声明任何复制/move 操作或析构函数。

这通常是正确的做法,因为如果可能的话,编译器将隐式声明所有这些操作,并使用您通常期望从这些操作中获得的语​​义来定义它们。

在您的情况下,Person 的所有成员都可以 move 构造,因此 Person 的隐式 move 构造函数将被定义为逐个 move 构造成员-一个。

这是在 mData(std::move(data)) 中添加 std::move 时使用的内容。没有它,data 是一个左值,而是使用复制构造每个成员的隐式复制构造函数。

复制构造 std::string 通常比 move 构造它的成本更高,这可能是该工具警告这种情况的原因,但如果 std::string 不存在。 move 构造和复制构造一个 int 成员是完全相同的操作。

如果您不想每次都检查一个类有哪些成员,您可以在这些情况下始终使用 std::move。例如,将 mId(id) 更改为 mId(std::move(id)) 是没有意义的,因为 id 是标量类型,但是它也不会使任何事情变得更糟。

关于c++ - 参数类没有 move 构造函数时IDE推荐 'pass by value and use std move',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71190880/

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