В соответствии со стандартом C ++ 11 вы можете объявить специальные функции-члены по умолчанию, используя default
ключевое слово.
class Foo
{
public:
Foo() = default;
Foo(const Foo& source) = default;
Foo(Foo&& source) = default;
~Foo() = default;
Foo& operator=(const Foo& right) = default;
Foo& operator=(Foo&& right) = default;
};
Мне было интересно, стоит ли объявлять все эти методы явно дефолтными или удаленными, если вам не нужна их индивидуальная реализация. Например, мне нужно реализовать конструктор копирования и оператор копирования-назначения для моего класса. Должен ли я отметить все другие специальные функции-члены с default
или же delete
ключевые слова, чтобы не думать каждый раз, когда я смотрю на класс, которые предоставляются компилятором, а которые нет?
Это зависит. Существуют правила, когда и будет ли компилятор генерировать эти функции автоматически. В случаях, когда компилятор этого не делает и они вам нужны, вы можете заставить его сгенерировать их, используя default или реализовать его самостоятельно. Случаи, когда компилятор не генерирует функции (это не полный список, пожалуйста, обратитесь к документации вашего компилятора):
Таким образом, в этих случаях вы можете вернуть их, используя default
если ты знаешь, что они будут где-то нужны. Однако в большинстве случаев вы должны позволить компилятору делать свое дело. Вы получите ошибку, если одна из этих функций не будет реализована автоматически.
Постскриптум Visual studio пока не поддерживает default
а также delete
для конструктора перемещения и оператора присваивания перемещения, пока.