如何禁止空列表初始化?

时间:2016-11-05 05:14:26

标签: 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

1 个答案:

答案 0 :(得分:4)

Empty A{};有效,因为Emptyaggregate。仅仅删除默认构造函数不足以阻止它成为聚合。

最简单的方法是给它一个char类型的私有成员,以便类型的大小不会发生变化。或者,您可以为其提供一个不是= default的私有默认构造函数。

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

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