我可以使用仅提供复制构造函数的类来创建类对象吗?

时间:2018-11-24 19:24:28

标签: c++ nullptr default-copy-constructor

是否可以创建仅提供复制代码的类的实例? 还是删除一个复制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;
}

1 个答案:

答案 0 :(得分:2)

如果对象唯一可访问的未删除构造函数是复制和移动构造函数,则不可能创建对象 de novo 的实例,但有一个例外:该对象可能支持聚合初始化。对于您来说,EmptyClass是一个聚合,因此我可以这样做:

EmptyClass c{};  // doesn't call the default constructor

为了防止这种情况,我们必须首先声明默认构造函数,然后然后将其定义为已删除:

struct EmptyClass {
    EmptyClass();
};
EmptyClass::EmptyClass() = delete;

这使EmptyClass不再汇总。在这种情况下,将不可能创建这种类型的对象。