gpt4 book ai didi

c++ - 删除默认 C++ 复制和移动构造函数和赋值运算符的缺点?

转载 作者:搜寻专家 更新时间:2023-10-31 01:36:35 24 4
gpt4 key购买 nike

如果一个类的实例永远不会被复制和移动,那么删除默认的移动和复制构造函数以及赋值运算符是否有任何缺点?这确实直接违反了 0 规则,但是否还有其他缺点(编译器会生成次优代码、次优数据布局等)?

最佳答案

特殊成员函数的存在与否对数据布局没有影响。好吧,至少在标准可以保证的程度上。也就是说,一个类是否是标准布局(因此具有定义明确的布局)与其构造函数无关。它只与它的成员有关。如果该类不是标准布局...那么标准将一事无成。

然而,用较少的理论术语来说,绝对没有理由缺少特殊的构造函数来影响类的布局。

显然,该标准无法强制生成“最佳代码”。但是没有真正的理由说明为什么存在或不存在所述成员会导致为您定义的函数生成更糟糕的代码。

将一个特殊的成员函数声明为已删除除了在有人试图调用它时导致编译失败之外没有任何意义。

现在,存在边缘情况,但这些都是围绕用户代码如何使用它们的。也就是说,如果您将对此类的引用传递给一些打算移动它的模板代码。但它可以接受固定类型,但它必须使用较慢的算法来这样做(出于某种原因)。它将使用 std::is_move_constructible 来检测类型不可移动并使用较慢的算法。

This does fly directly against the rule of 0

……那又怎样?规则是使用默认语义,除非您的类需要其他语义。 unique_ptr 在概念上是一种复制没有意义的类型,因此它删除了复制操作。如果您的类型在概念上是一种复制和移动没有意义的类型,那么您应该删除这些操作。

请注意,“没有意义”意味着它在逻辑上是无效的,具体取决于您的类型正在做什么。 unique_ptr根据定义,唯一拥有一个对象。复制指针意味着它并不唯一拥有该对象。由于这在逻辑上是无效的,因此无法复制该类。

如果您的类在概念上是不可移动的,那么您应该在 C++ 中使其不可移动。

关于c++ - 删除默认 C++ 复制和移动构造函数和赋值运算符的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35375735/

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