是否可以创建仅提供复制代码的类的实例? 还是删除一个复制ctor(如果它删除了所有其他ctor,这是一个好设计吗?)
struct EmptyClass
{
EmptyClass() = delete;
// using compiler generated copy ctor.
// empty class, also nothing virtual.
void fn()
{
}
};
int main()
{
{
const EmptyClass obj(*static_cast<const EmptyClass*>(nullptr));
obj.fn();
}
// or
{
char buffer[sizeof EmptyClass]{};
const EmptyClass obj(*reinterpret_cast<const EmptyClass*>(buffer);
obj.fn();
}
return 0;
}
答案 0 :(得分:2)
如果对象唯一可访问的未删除构造函数是复制和移动构造函数,则不可能创建对象 de novo 的实例,但有一个例外:该对象可能支持聚合初始化。对于您来说,EmptyClass
是一个聚合,因此我可以这样做:
EmptyClass c{}; // doesn't call the default constructor
为了防止这种情况,我们必须首先声明默认构造函数,然后然后将其定义为已删除:
struct EmptyClass {
EmptyClass();
};
EmptyClass::EmptyClass() = delete;
这使EmptyClass
不再汇总。在这种情况下,将不可能创建这种类型的对象。