struct A
{
A(const A& arg) : data(arg.data)
{
do_something_special();
}
// by writing copy constructor, we suppress the generation of
// implicit default constructor A::A()
int data;
};
void foo1()
{
A a; // does not work, since there's no default constructor
}
Допустим, наш конструктор по умолчанию не делает ничего особенного и (более или менее) равен сгенерированному компилятором.Мы можем исправить это, написав наш собственный конструктор по умолчанию (который может стать утомительным, если в нашем классе много нестатических членов), или используя синтаксис = default
:
struct A
{
A() = default;
A(const A& arg) : data(arg.data)
{
do_something_special();
}
int data;
};
Удаление функцийполезно, когда мы хотим запретить использование определенных перегрузок или специализаций шаблонов, или просто для запрета копирования (или перемещения) объектов.
void foo(char c) {}
void foo(int i) = delete; // do not allow implicit int -> char conversion
Когда вы хотите запретить копирование (то есть объекты потоков), обычный идиоматический способэто объявить частный конструктор копирования без реализации (да, или использовать boost :: noncopyable).Хотя это работает в большинстве случаев, иногда вы можете получить некоторые неясные ошибки компоновщика.Обратите внимание:
struct A
{
A() = default;
friend void foo();
private:
A(const A&);
};
void foo()
{
A a;
A b(a); // results in linker error in gcc
}
Удаление A(const A&)
исключено, мы избегаем потенциальных ошибок компоновщика и делаем наше намерение (запретить копирование) очень ясным.