1

是否可以创建仅提供 copy-ctor 的类的实例?或者,如果删除所有其他ctors,那么删除一个copy-ctors是否是好的设计?

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;
}
4

1 回答 1

2

如果对象的唯一可访问的非删除构造函数是复制和移动构造函数,则不可能从头创建对象的实例,但有一个例外:对象可能支持聚合初始化。在你的情况下,EmptyClass是一个聚合,所以我可以这样做:

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

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

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

这使得EmptyClass不是一个聚合。在这种情况下,不可能创建这种类型的对象。

于 2018-11-24T19:33:10.227 回答