是否可以创建仅提供复制代码的类的实例?
还是删除一个复制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不是聚合的。在这种情况下,将不可能创建这种类型的对象。

09-05 22:47