gpt4 book ai didi

c++ - 在每个不提供用户定义的 move 构造函数的类中显式声明默认的 move 构造函数是一种好习惯吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:39 26 4
gpt4 key购买 nike

有相当复杂的(对我来说)rules定义何时生成隐式默认 move 构造函数以及何时不生成它。我担心的是不会生成默认的 move 构造函数。此外,我担心我(或其他人)将来会修改该类,隐式 move 构造函数将消失。

有一个"advice"这就是说 “您始终可以显式调用可以使用 = default 自动生成的函数的默认生成(这就是语法的用途)”。现在我问:这是个好主意吗?有什么理由不这样做吗?我想如果没有问题那么我们就不需要默认的 move 构造函数, move 构造函数总是会被生成。但由于该标准定义了如此严格的规则,因此可能有这样做的理由。

最佳答案

考虑以下场景。您有一个适用于自动生成的 move 构造函数和析构函数的类:

class X {
int i_;
public:
X(int i) : i_(i) { }
};

然后,在未来,你添加一个成员变量,它需要用户定义的复制构造函数和析构函数:

class X {
int i_;
char* buf_;
size_t n_;
public:
X(int i, size_t n) : i_(i), n_(n), buf_(new char[n]) { }
X(const X& o) : i_(o.i_), n_(o.n_), buf_(new char[o.n_]) { memcpy(buf_, o.buf_, n); }
~X() { delete[] buf_; }
};

如果此处 move 构造函数是默认,则新类版本将是错误的。

如果没有 defaulted move 构造函数,根据 五规则 修改类是没问题的,如果需要 5 个特殊函数之一 < em>用户定义,其他的也可能需要用户定义。如果需要,您现在必须手动定义 move 构造函数。

关于c++ - 在每个不提供用户定义的 move 构造函数的类中显式声明默认的 move 构造函数是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49003289/

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