访问控制对于已删除的构造函数是否重要?
Does access control matter for deleted constructors?
显式删除的构造函数是public
、protected
还是private
之间行为是否有区别?
例如,不可复制的类将具有已删除的复制构造函数(以及已删除的复制赋值)。构造函数对子类(或友元)和类的外部用户都不可用,因为它不存在,无论其访问控制如何。
我看到的唯一区别是不同的作用域会以何种方式看到复制构造函数不存在 - 无论它只是不存在(据该作用域所知)还是被显式删除。
现在,为类提供最好的正式界面可能是有益的 - 也就是说,如果每个人都应该知道该类是不可复制的,则应将其公开删除。编译器错误消息也可能提供更多信息。但除此之外 - 类行为是否有任何实际可观察到的差异?也就是说,可以对一个类执行某些操作,该类的已删除构造函数具有访问权限 X,如果该构造函数具有访问权限 Y,他就无法执行该类?
由于在这种情况下,是重载分辨率使程序格式不正确,而不是访问说明符(稍后会检查),因此结果没有差异。编译器总是会抱怨选择了已删除的函数。
但是由于 C++11 之前的成语是"声明但不定义私人副本 c'tor 以禁用复制">,我认为它与相同的成语一致,因此是有利的。你正在使用"旧俚语"和一些新语言来描述同样的事情,除了更好。
相关文章:
- 无论如何,我可以确定构造函数是否存在吗?
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 你能在类和构造函数中初始化吗,这是否正确?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 在 constexpr 构造函数中初始化数组是否合法?
- 如果这不是类的"复制构造函数",是否可以移动对象?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 我是否需要在构造函数中显式初始化 std::unique_ptr?
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 移动构造函数是否C++过时?
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?