如何删除C++中类的所有隐式(默认)方法?

2024-01-04

C++编译器在一定条件下为类添加隐式默认构造函数、复制构造函数、析构函数、转换运算符、赋值运算符等以及其他隐式方法。

如何以最短的方式禁用/删除所有可能的隐式方法?

我不希望我的类不可复制,我只想禁用这些默认方法,以便编译器抛出编译错误,然后我自己实现它们。我只是想要过度控制,这样编译器就不会为我的类做任何无声的工作。

例如我可以做下一步(这只是一个虚拟的例子,在现实生活中我可以有任何复杂的类):

class C {
private:
    C() = delete;
    C(C const & other) = delete;
    C & operator = (C const & other) = delete;
};

但这是很长的路,我也可能忘记删除一些方法签名,我需要删除所有它们。所以我自己从头开始重新实现所有方法。

我需要查看其他代码需要/使用且我尚未实现的所有方法的错误,而不是编译器默默地为我实现这些方法。

另外,如果我像上面的示例中那样删除默认方法,我如何确定没有其他静默创建的方法?网上是否有编译器默默创建的 100% 所有标准方法的列表?


您可以采用 mixin 方法。定义一次麻烦的类

class DeleteAllSpecialMemebers {
private:
    DeleteAllSpecialMemebers() = delete;
    DeleteAllSpecialMemebers(DeleteAllSpecialMemebers const &) = delete;
    DeleteAllSpecialMemebers & operator = (DeleteAllSpecialMemebers const &) = delete;
    DeleteAllSpecialMemebers(DeleteAllSpecialMemebers &&) = delete;
    DeleteAllSpecialMemebers & operator = (DeleteAllSpecialMemebers &&) = delete;
protected:
    struct token { explicit token() = default; };
    DeleteAllSpecialMemebers(token) {}
};

然后继承它:

class C : private DeleteAllSpecialMemebers{
public:
    C(int) : DeleteAllSpecialMemebers(token{}) {}
};

额外的tokentype 是允许派生类实现other构造函数,例如C::C(int)(或者甚至是用户提供的C::C()).

现场观看 https://wandbox.org/permlink/VVk0EPXI0zu7Gq88.

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

如何删除C++中类的所有隐式(默认)方法? 的相关文章

随机推荐

  • 无法解析 Toast 的 maketext() 方法

    我在创建时遇到错误Toast Toast toast Toast makeText this text duration 我无法解决makeText 的方法Toast 我收到这个错误 java no suitable method foun
  • 阻止新创建的对话框获取焦点

    我正在尝试创建 Java Swing 对话框 但我不希望该对话框将焦点从当前关注的内容上移开 例如 如果您正在编辑 Word 文档 而另一个应用程序创建了一个对话框 您应该会看到该对话框 但 Word 文档应保持焦点 以便您可以继续编辑 我
  • 使用成员变量作为谓词

    我试图在对象向量中找到一个成员变量值为 true 的对象 是否可以在不定义lambda函数或函数对象的情况下 仅通过指定成员变量本身来完成 class A public explicit A bool v int v2 float v3 v
  • OpenCV、dlib 地标旋转

    我是 OpenCV 和 dlib 的新手 我不确定我的设计是否正确 我想为 Android 手机编写一个 C 人脸检测器 它应该检测具有不同手机方向和旋转角度的人脸 当手机方向为纵向和横向时 让我们留下来 我正在使用 OpenCV 旋转 编
  • Spring Data JDBC / Spring Data JPA 与 Hibernate

    在哪些典型的现实生活场景中 人们会选择 Spring Data JDBC Spring Data JPA 与 Hibernate 我想了解这些实现最适合的场景 正如 Naros 所说 目前标题中的问题并没有真正起作用 看来我们确实应该考虑
  • 通过 HTTPS 获取 R 脚本

    有没有办法从网络获取 R 脚本 e g source http github com project R file r 原因 我目前有一个项目想要可供使用 但尚未准备好打包 因此 如果能够为人们提供一个可以从网络获取的单个文件 然后该文件将
  • Google Sheets - 将组中的不规则列数据转置为行

    很像中数据转置的问题转置列数据 https stackoverflow com questions 68426024 google sheets transpose column data in groups into rows我一直在尝试
  • 如何在 Java 中获取 RSA 密钥的大小

    给定一个 java security interfaces RSAKey 如何获取它的大小 你可以试试这个 key getModulus bitLength
  • ASP.Net Web API 模型绑定不像 MVC 3 中那样工作

    我的印象是 ASP Net Web API 中的模型绑定应该支持与 MVC 支持的最低功能级别相同的绑定 采用以下控制器 public class WordsController ApiController private string w
  • 如何部署节点应用程序依赖项?如何确保使用 npm 安装某个包的某些版本?

    部署节点应用程序依赖项的最佳方法是什么 如何确保使用 npm 安装某个包的某些版本 是否有像 python 的 pip 中的 requests txt 这样的配方文件 A package json指定模块的依赖关系 https docs n
  • 在 homebrew 中更新 pip 和 setuptools 不起作用

    After brew install python 出现以下内容 Pip and setuptools have been installed To update them pip2 install upgrade pip setuptoo
  • $lookup mongodb 中的嵌套数组

    我正在与新鲜事物作斗争 可爱 lookupMongoDB 中的运算符 我有3个收藏 artists id ObjectId 5b0d2b2c7ac4792df69a9942 name Dream Theater started in Num
  • 如何防止 CFEXECUTE 在 PrintStackTrace 之后挂起

    我正在使用 ColdFusion MX7 对某些 Java 6 代码执行 CFEXECUTE 不幸的是 由于 CF7 不能在 JDK 6 下工作 我必须这样做 我的问题是 当 Java 代码中发生异常时 如果我调用printStackTra
  • Java- CSV /删除csv文件中的列

    我尝试用 Java 删除 csv 文件中的一列 例如 我有这个 csv 文件 ID name1 name2 name3 1 hello hell hel 2 try tr t 3 browser bro br 我想要在下一次操作之后 删除
  • 如果没有 Provides 注释的方法,则无法提供 Android dagger

    我决定学习dagger依赖注入框架 经过一些教程后 我尝试将 dagger 实现到我的项目中 但是我收到了这个错误 com assigment di component AppComponent java 11 error Dagger M
  • URL 重写 PHP $_GET 变量

    嘿 我正在寻找一个 htaccess 重写文件来更改 newProject index php start 2 to newProject page 2 我该怎么办 谢谢 我认为你的问题是倒退的 特别是如果你正在寻找更干净的网址 Rewri
  • 使用 oledb 命令从存储过程检索输出参数 vb.net

    我的存储过程 PROCEDURE dbo addMasterTransaksi kodeSuplier varchar 10 Total money kodeUser varchar 10 isLunas varchar 2 Dp mone
  • rep 的文档是否告诉我们它是一个内部通用函数?

    因为它已开启内部通用函数列表 https stat ethz ch R manual R patched library base html InternalMethods html 我知道rep是一个内部通用函数 这个事实是否仅通过阅读就
  • AngularJS 中具有嵌套状态的嵌套视图

    我正在尝试创建嵌套状态 但出了点问题 我不明白为什么 我的角度应用程序中有这些状态 client list clients client id show client client new new client 现在 我正在尝试做 clie
  • 如何删除C++中类的所有隐式(默认)方法?

    C 编译器在一定条件下为类添加隐式默认构造函数 复制构造函数 析构函数 转换运算符 赋值运算符等以及其他隐式方法 如何以最短的方式禁用 删除所有可能的隐式方法 我不希望我的类不可复制 我只想禁用这些默认方法 以便编译器抛出编译错误 然后我自