是否可以创建仅提供复制代码的类的实例?
还是删除一个复制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;
}
最佳答案
如果对象唯一可访问的未删除构造函数是复制和移动构造函数,则不可能从头创建对象的实例,但有一个异常(exception):该对象可能支持聚合初始化。在您的情况下,EmptyClass
是一个聚合,因此我可以这样做:
EmptyClass c{}; // doesn't call the default constructor
为了防止这种情况,我们必须首先声明默认构造函数,然后将其定义为delete:
struct EmptyClass {
EmptyClass();
};
EmptyClass::EmptyClass() = delete;
这使得
EmptyClass
不是聚合的。在这种情况下,将不可能创建这种类型的对象。