访问控制对已删除的构造函数是不是重要?

Posted

技术标签:

【中文标题】访问控制对已删除的构造函数是不是重要?【英文标题】:Does access control matter for deleted constructors?访问控制对已删除的构造函数是否重要? 【发布时间】:2018-04-08 12:49:50 【问题描述】:

显式删除的构造函数是publicprotected还是private在行为上是否存在差异?

例如,不可复制的类将具有已删除的复制构造函数(和已删除的复制分配)。构造函数对子类(或朋友)和类的外部用户均不可用,因为无论其访问控制如何,它都不存在。

我看到的唯一区别是不同作用域会以何种方式看到复制构造函数不存在 - 无论是不存在(就该作用域所知)还是被显式删除。

现在,为该类提供最好的正式接口可能是有益的——也就是说,如果每个人都知道该类是不可复制的,那么它应该被公开删除。编译器错误消息也可能提供更多信息。但除此之外 - 课堂行为是否会有任何实际可观察​​到的差异?也就是说,如果类的构造函数具有访问权限 X,那么如果该构造函数具有访问权限 Y,他就无法做到这一点?

【问题讨论】:

【参考方案1】:

由于在这种情况下是重载决议使程序格式错误,而不是访问说明符(稍后检查),因此结果没有区别。编译器总是会抱怨选择了一个已删除的函数。

但由于 C++11 之前的成语是“声明但不定义私有复制 c'tor 以禁用复制”,我会认为它与相同的成语一起使用,因此是有利的.您正在使用带有某种新语言的“旧俚语”来描述相同的事物,但更好。

【讨论】:

我实际上认为,在大多数情况下,在大多数情况下制作删除的副本 ctor public 在语义上更有意义 - 当您希望公开声明该类的 interface 时不可复制。无论如何,我很好奇行为是否有任何差异(对于一般的构造函数,不仅仅是我用作示例的副本)。 @Danra - 它所做的唯一不同是最终的风格。由于许多风格指南会将公共/受保护/私人成员聚集在他们自己的“部分”中。如果考虑到这一点,同样的论点反过来也适用。将 c'tor 设为私有会将其推送到类公共 API 之外,该类不可复制。 @StoryTeller 除非它没有被删除,它仍然可以被朋友或自己的设施复制 @Swift - 是的,那是另一回事。如果确实选择稍后定义它,则默认情况下它会影响最小的范围。在我的书中也很好。

以上是关于访问控制对已删除的构造函数是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

在控制器的构造函数中访问 HttpContext.Request

ASP.NET Core 访问控制器构造函数中的 User.Identity

Java内构造函数关键字权限修饰符访问控制及面向对象的特性!

WebApi接口访问异常问题。尝试创建“testController”类型的控制器时出错。请确保控制器具有无参数公共构造函数

squid缓存服务器ACL访问控制

Squid的ACL访问控制及反向代理