Могу ли я создать объекты класса с классом, который просто предлагает конструктор копирования? - PullRequest
0 голосов
/ 24 ноября 2018

Можно ли создать экземпляры класса, который предлагает только copy-ctor?Или это хороший дизайн, чтобы также удалить copy-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 голосов
/ 24 ноября 2018

Невозможно создать экземпляры объекта de novo , если единственными доступными не удаленными конструкторами объекта являются конструкторы копирования и перемещения, за одним исключением: объект может поддерживать агрегатную инициализацию.В вашем случае EmptyClass является агрегатом, поэтому я могу сделать это:

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

Чтобы предотвратить это, мы должны сначала объявить конструктор по умолчанию, а , а затем определить его как удаленный:

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

Это делает EmptyClass не агрегатом.В этом случае будет невозможно создавать объекты этого типа.

...