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

Можно ли создать экземпляры класса, который предлагает только 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

Решение

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

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

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector