C++11 如何禁止空列表初始化?

C++11 如何禁止空列表初始化?,c++11,c++14,default-constructor,list-initialization,deleted-functions,C++11,C++14,Default Constructor,List Initialization,Deleted Functions,我有一个班,根本没有任何成员。因此,它不打算被实例化。所以,我删除了默认的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 空A{};之所以

我有一个班,根本没有任何成员。因此,它不打算被实例化。所以,我删除了默认的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
空A{};之所以有效,是因为空是一个错误。仅仅删除默认构造函数不足以防止它成为C++17中的聚合;在C++20中,这将起作用

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

但是,仅仅因为类型不用于生成对象,并不意味着您应该特别注意防止它这样做。如果enable_也是一个类型,那么该类型的对象并不意味着要构造。但你仍然可以做到


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

另一个难看的方法是添加用户提供的构造函数,例如Emptydummy{};私有:结构虚拟{};