gpt4 book ai didi

c++ - 多态类中没有隐式复制构造函数?

转载 作者:太空狗 更新时间:2023-10-29 21:22:41 41 4
gpt4 key购买 nike

在 C++11 中,多态类(具有 virtual 成员方法的类)应该/必须有一个 virtual 析构函数(以便 delete 在基类指针上执行预期的操作)。但是,显式声明析构函数会弃用复制构造函数的隐式生成(尽管编译器可能不会广泛实现),因此也会弃用默认构造函数。因此,要使任何多态类不被弃用,它必须具有这些成员

virtual ~polymorphic_class() = default;
polymorphic_class() = default;
polymorphic_class(polymorphic_class const&) = default;

明确定义,即使它们是微不足道的。我对么? (这不是很烦人吗?) 这背后的逻辑是什么?有什么办法可以避免吗?

最佳答案

Am I correct?

是的,根据 ForEveRpost .

Is there any way to avoid that?

是的。通过为所有多态类实现一个基类(类似于 Java 中的类 Object 和 D,它是所有类层次结构的根),只需执行一次:

struct polymorphic {

polymorphic() = default;
virtual ~polymorphic() = default;

polymorphic(const polymorphic&) = default;
polymorphic& operator =(const polymorphic&) = default;

// Those are not required but they don't harm and are nice for documentation
polymorphic(polymorphic&&) = default;
polymorphic& operator =(polymorphic&&) = default;
};

然后,任何从 polymorphic 公开派生的类都将有一个隐式声明和定义(默认)的虚拟析构函数,除非您自己声明一个。

class my_polymorphic_class : public polymorphic {
};

static_assert(std::is_default_constructible<my_polymorphic_class>::value, "");
static_assert(std::is_copy_constructible <my_polymorphic_class>::value, "");
static_assert(std::is_copy_assignable <my_polymorphic_class>::value, "");
static_assert(std::is_move_constructible <my_polymorphic_class>::value, "");
static_assert(std::is_move_assignable <my_polymorphic_class>::value, "");

What is the logic behind this?

我不能确定。以下内容仅为推测。

在 C++98/03 中,Rule of Three说如果一个类需要用户定义的复制构造函数、复制赋值运算符或析构函数,那么它可能需要这三个都是用户定义的。

遵守三原则是一种很好的做法,但这只不过是一个准则。标准不强制它。为什么不?我猜人们是在标准发布后才意识到这条规则的。

C++11 引入了移动构造函数和移动赋值运算符,将三规则转变为五规则。事后看来,委员会想要执行五人规则。这个想法是:如果这五个特殊函数中的任何一个是用户声明的,那么其他函数,但析构函数,将不会被隐式默认。

但是,委员会并不想通过强制执行此规则来破坏几乎所有 C++98/03 代码,因此决定仅部分执行此操作:

  1. 如果移动构造函数或移动赋值运算符是用户声明的,则除析构函数之外的其他特殊函数将被删除。

  2. 如果这五个特殊函数中的任何一个是用户声明的,则不会隐式声明移动构造函数和移动赋值运算符。

对于 C++98/03 格式良好的代码,移动构造函数和移动赋值运算符都不是用户声明的,规则 1 不适用。因此,当使用 C++11 兼容编译器编译时,C++98/03 格式良好的代码不会因为这条规则而无法编译。 (如果是,那是出于其他原因。)

此外,根据规则 2,移动构造函数和移动赋值运算符未隐式声明。这也不会破坏 C++98/03 格式良好的代码,因为他们从来没有预料到移动操作的声明。

OP 中提到并在 ForEveR 中引用的弃用的 post建议通过 future 的标准可能执行五人法则。做好准备!

关于c++ - 多态类中没有隐式复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19997646/

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