我有一个班级,根本没有任何成员。因此,它不打算被实例化。所以,我删除了默认cr。这禁止除了列表初始化之外的任何构造。有什么办法也可以禁止吗?
class Empty{
//No non-static data members
Empty()=delete;
};
Empty A{};// is allowed
Empty A ={};//is allowed too
//Empty A; ok, forbidden
//Empty A=Empty(); ok, forbidden
我有一个班级,根本没有任何成员。因此,它不打算被实例化。所以,我删除了默认cr。这禁止除了列表初始化之外的任何构造。有什么办法也可以禁止吗?
class Empty{
//No non-static data members
Empty()=delete;
};
Empty A{};// is allowed
Empty A ={};//is allowed too
//Empty A; ok, forbidden
//Empty A=Empty(); ok, forbidden
Empty A{};
有效,因为Empty
它是一个聚合。仅仅删除默认构造函数不足以防止它成为聚合(在 C++17 中;在 C++20 中,这将起作用)。
最简单的方法是给它一个类型的私有成员,char
这样类型的大小就不会改变。或者,您可以给它一个未= default
编辑的私有默认构造函数。
然而,仅仅因为一个类型不是用来制造一个对象的,并不意味着你应该特别注意防止它这样做。std::enable_if<blah>
也是一种类型,并且该类型的对象不应该被构造。但你仍然可以做到。
除非用户创建该类型的对象会导致真正的问题,否则不应采取这些步骤。