gpt4 book ai didi

c++ - 在 move 构造函数中窃取

转载 作者:IT老高 更新时间:2023-10-28 23:11:20 26 4
gpt4 key购买 nike

在一个玩具类的move构造函数的实现过程中,我注意到一个模式:

array2D(array2D&& that)
{
data_ = that.data_;
that.data_ = 0;

height_ = that.height_;
that.height_ = 0;

width_ = that.width_;
that.width_ = 0;

size_ = that.size_;
that.size_ = 0;
}

模式显然是:

    member = that.member;
that.member = 0;

所以我写了一个预处理器宏来让窃取变得不那么冗长和容易出错:

#define STEAL(member) member = that.member; that.member = 0;

现在实现如下:

array2D(array2D&& that)
{
STEAL(data_);
STEAL(height_);
STEAL(width_);
STEAL(size_);
}

这样做有什么缺点吗?有没有不需要预处理器的更清洁的解决方案?

最佳答案

这是推荐的模式:

array2D(array2D&& that)
: data_(std::move(that.data_)),
height_(std::move(that.height_)),
width_(std::move(that.width_)),
size_(std::move(that.size_))
{
that.data_ = 0;
that.height_ = 0;
that.width_ = 0;
that.size_ = 0;
}

如果数据成员是标量类型,自然不需要 std::move。但是,如果您要复制此模式,则无论如何都包含 move 会很有帮助,这样当成员数据不是标量时, std::move 不会不要忘记。

此外,如果成员数据具有实际的 move 构造函数,那么您可以简单地省略主体:

array2D(array2D&& that)
: data_(std::move(that.data_)),
height_(std::move(that.height_)),
width_(std::move(that.width_)),
size_(std::move(that.size_))
{
}

如果您想推广到没有 move 构造函数但确实具有无资源默认构造状态的类型,您可以:

array2D(array2D&& that)
: data_(std::move(that.data_)),
height_(std::move(that.height_)),
width_(std::move(that.width_)),
size_(std::move(that.size_))
{
that.data_ = Data();
that.height_ = Height();
that.width_ = Width();
that.size_ = Size();
}

我建议按照它们在 array2D 类定义中声明为数据成员的顺序对这些语句进行排序。而且我发现在正文中重复初始化列表没有任何问题。它必要的第二步。没有必要把它扫到地毯下。

关于c++ - 在 move 构造函数中窃取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6492367/

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