在 C++11 中显式删除成员函数后,是否仍然值得从不可复制的基类继承?

2023-12-21

在 C++11 中显式删除成员函数后,是否仍然值得从不可复制的基类继承?

我说的是你私下继承一个基类的技巧,该基类具有私有或删除的复制构造函数和复制赋值(例如boost::noncopyable http://www.boost.org/doc/libs/release/libs/utility/utility.htm#Class_noncopyable).

在此提出的优点是question https://stackoverflow.com/questions/7823990/what-are-the-advantages-of-boostnoncopyable仍然适用于 C++11 吗?


我不明白为什么有些人声称在 C++11 中使类不可复制更容易。

在 C++03 中:

private:
    MyClass(const MyClass&) {}
    MyClass& operator=(const MyClass&) {}

在 C++11 中:

MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;

EDIT:

正如许多人指出的那样,为私有复制构造函数和复制赋值运算符提供空主体(即 {})是错误的,因为这将允许类本身调用这些运算符而不会出现任何错误。我一开始没有添加 {},但遇到了一些链接器问题,导致我出于某种愚蠢的原因添加了 {}(我不记得当时的情况)。我知道更好。 :-)


嗯,这个:

private:
    MyClass(const MyClass&) {}
    MyClass& operator=(const MyClass&) {}

技术上仍然允许MyClass供会员和朋友复制。当然,理论上这些类型和函数都在你的控制之下,但类仍然是copyable。至少与boost::noncopyable and = delete, nobody可以复制班级。


我不明白为什么有些人声称在 C++11 中使类不可复制更容易。

与其说“更容易”,不如说“更容易消化”。

考虑一下:

class MyClass
{
private:
    MyClass(const MyClass&) {}
    MyClass& operator=(const MyClass&) {}
};

如果您是一名 C++ 程序员,读过 C++ 的介绍性文本,但很少接触惯用的 C++(即:lotC++ 程序员),这……令人困惑。它声明了复制构造函数和复制赋值运算符,但它们是空的。那么为什么要声明它们呢?是的,他们是private,但这只会提高more问题:为什么将它们设为私有?

要理解为什么这会阻止复制,您必须意识到,通过将它们声明为私有,您可以使非会员/朋友无法复制它。这对于新手来说并不是很明显。当他们尝试复制它时,也不会收到错误消息。

现在,将其与 C++11 版本进行比较:

class MyClass
{
public:
    MyClass(const MyClass&) = delete;
    MyClass& operator=(const MyClass&) = delete;
};

怎样才能理解这个类不能被复制呢?无非就是了解什么= delete语法意思。任何解释 C++11 语法规则的书都会准确地告诉您它的作用。对于没有经验的 C++ 用户来说,这段代码的效果是显而易见的。

这个习语的伟大之处在于它成为一个习语,因为它是准确表达你的意思的最清晰、最明显的方式。

Even boost::noncopyable需要多一点思考。是的,它被称为“不可复制”,因此它是自记录的。但如果您以前从未见过它,就会产生疑问。为什么你要从无法复制的东西中衍生出来?为什么我的错误消息谈到boost::noncopyable的复制构造函数?等等。同样,理解这个习语需要更多的脑力劳动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++11 中显式删除成员函数后,是否仍然值得从不可复制的基类继承? 的相关文章

  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大

随机推荐