2

我有一个班级,根本没有任何成员。因此,它不打算被实例化。所以,我删除了默认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
4

1 回答 1

4

Empty A{};有效,因为Empty它是一个聚合。仅仅删除默认构造函数不足以防止它成为聚合(在 C++17 中;在 C++20 中,这将起作用)。

最简单的方法是给它一个类型的私有成员,char这样类型的大小就不会改变。或者,您可以给它一个未= default编辑的私有默认构造函数。

然而,仅仅因为一个类型不是用来制造一个对象的,并不意味着你应该特别注意防止它这样做。std::enable_if<blah>也是一种类型,并且该类型的对象不应该被构造。但你仍然可以做到。

除非用户创建该类型的对象会导致真正的问题,否则不应采取这些步骤。

于 2016-11-05T05:27:38.853 回答