如何禁止空列表初始化?

How to forbid empty list initialization?

我有一个 class,它根本没有任何成员。因此,它不打算被实例化。所以,我删除了默认的 c-r。这禁止除了列表初始化之外的任何构造。有什么方法可以禁止吗?

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 是一个 aggregate。仅删除默认构造函数不足以防止它成为聚合(在 C++17 中;在 C++20 中,这将起作用)。

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

但是,仅仅因为类型不打算用于创建对象并不意味着您应该特别注意防止它这样做。 std::enable_if<blah> 也是一种类型,该类型的对象并不意味着要构造。不过你还是可以的。

您不应该执行这些步骤,除非存在真正的问题,这可能是由用户创建该类型的对象引起的。