gpt4 book ai didi

c++ - move 构造函数(和其他)的正确实现是什么?

转载 作者:可可西里 更新时间:2023-11-01 18:29:35 25 4
gpt4 key购买 nike

我有一个包含 std::vector 的简单类,我想在按值返回类时受益于 move 语义(不是 RVO)。

我通过以下方式实现了 move 构造函数、复制构造函数和复制赋值运算符:

class A
{
public:
// MOVE-constructor.
A(A&& other) :
data(std::move(other.data))
{
}

// COPY-constructor.
A(const A& other) :
data(other.data)
{
}

// COPY-ASSIGNMENT operator.
A& operator= (const A& other);
{
if(this != &other)
{
data = other.data;
}

return *this;
}

private:
std::vector<int> data;
};

以上实现是否正确?

还有一个问题:我什至必须实现这些成员中的任何一个,还是它们是由编译器自动生成的?我知道复制构造函数和复制赋值运算符是默认生成的,但是编译器也可以自动生成 move 构造函数吗? (我用 MSVC 和 GCC 编译这段代码。)

提前感谢您的任何建议。 (我知道已经有一些类似的问题,但不是针对这种情况。)

最佳答案

对于这个类来说,它们都是不必要的[*],因为如果你没有声明它们中的任何一个,它就会有隐式的。

您的构造函数没问题。所以下面的代码表面上调用了 move 构造函数:

A f() { return A(); }
A a = f(); // move construct (not copy construct) from the return value of f

事实上,move-elision 可能会启动,在这种情况下,实际上只会调用无参数构造函数。我假设您计划提供一些构造函数,而不是复制和 move ;-)

您的复制赋值很好,它与隐式赋值的不同之处仅在于它具有自赋值检查,而隐式赋值则没有。我认为我们不应该争论 self 分配检查是否值得,这并没有错。

您尚未定义 move 赋值运算符。鉴于您定义了其他人,您应该已经完成​​了,但是如果您摆脱了其余部分,它就是隐含的 [*]。 move 赋值运算符(无论是用户定义的还是隐式的)确保以下代码将 move 而不是复制:

A a;
a = f();

[*] 在一个完整的 C++11 实现上,目前还不存在。您可以在每个编译器的基础上检查此功能是否已实现,并且在 MSVC 实现之前,您可能会遇到一些可怕的 #define 恶作剧。

关于c++ - move 构造函数(和其他)的正确实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14212508/

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