C ++ 11 — явно объявить дефолтные методы в переполнении стека

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

1

Решение

Это зависит. Существуют правила, когда и будет ли компилятор генерировать эти функции автоматически. В случаях, когда компилятор этого не делает и они вам нужны, вы можете заставить его сгенерировать их, используя default или реализовать его самостоятельно. Случаи, когда компилятор не генерирует функции (это не полный список, пожалуйста, обратитесь к документации вашего компилятора):

  • при объявлении конструктора с аргументами конструктор по умолчанию не создается
  • конструктор перемещения и оператор присваивания перемещения не создаются, когда вы объявляете конструктор копирования и оператор присваивания копии (и наоборот)

Таким образом, в этих случаях вы можете вернуть их, используя default если ты знаешь, что они будут где-то нужны. Однако в большинстве случаев вы должны позволить компилятору делать свое дело. Вы получите ошибку, если одна из этих функций не будет реализована автоматически.

Постскриптум Visual studio пока не поддерживает default а также delete для конструктора перемещения и оператора присваивания перемещения, пока.

1

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