gpt4 book ai didi

c++ - 为什么删除成员变量的复制构造函数不会阻止默认复制构造函数

转载 作者:行者123 更新时间:2023-11-27 23:40:15 26 4
gpt4 key购买 nike

class A {
public:
A() = default;
A(const A&) = delete;
A(A&&) = delete;
};

class B {
public:
B() = default;
B(const B&) = default;
B(B&&) = default;

A a_;
};

int main() {
B b{};
static_cast<void>(b);
}

为什么要编译?复制构造函数不应有默认定义,因为 A 有一个已删除的复制构造函数。在这种情况下,默认复制构造函数意味着什么?我在这里缺少什么?

最佳答案

将一个特殊成员声明为默认成员意味着会有一个可用的定义。相反,= default 表示“在此处填写合理的含义”,这也可能意味着该成员最终被定义为已删除,如果这是唯一合理的事情(例如,如果类成员不是可复制)。

精确的规则在 [class.copy.ctor] 中:

[...] A defaulted copy/move constructor for a class X is defined as deleted (9.4.3) if X has:

  • a potentially constructed subobject type M (or array thereof) that cannot be copied/moved because overload resolution (11.3), as applied to find M’s corresponding constructor, results in an ambiguity or a function that is deleted or inaccessible from the defaulted constructor,
  • [...]

也就是说,您的 B::B(const B&) 最终被定义为已删除。一旦您尝试制作 b 的拷贝,您就会注意到这一点。

关于c++ - 为什么删除成员变量的复制构造函数不会阻止默认复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55681387/

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