Могу ли я создать объекты класса с классом, который просто предлагает конструктор копирования?
Можно ли создать экземпляры класса, который предлагает только 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
не совокупность. В этом случае будет невозможно создавать объекты этого типа.