Легче рассмотреть различные варианты, когда вы добавляете дополнительную привязку. Рассмотрим:
struct A {
int i;
std::vector<int> coll;
};
В этом случае компилятор генерирует c'tor по умолчанию для вас, но i
не инициализируется, поэтому вам придется установить его в явном виде.
Давайте улучшить положение вещей:
struct B {
int i {};
std::vector<int> coll;
};
Для B
, компилятор генерирует также c'tor по умолчанию для вас, но i
инициализируется в классе, и поэтому по умолчанию построенный объект типа B
а является полностью инициализируется. Теперь предположим, что я хочу, чтобы добавить определенный пользователем c'tor:
struct C {
int i {};
std::vector<int> coll;
C(int const j) : i{j} {}
};
Добавление определяемых пользователем c'tor подавляет автоматическую генерацию конструктора по умолчанию. Таким образом, чтобы включить c'tor по умолчанию, можно сделать несколько разных вещей:
struct D1 {
int i {};
std::vector<int> coll;
D1(int const j) : i{j} {}
D1(){}
};
Хотя выше хорошо образован, я считаю, это некрасиво. Здесь D1(){}
- по умолчанию c'tor, а i
соответственно инициализирован, так как он имеет инициализатор в классе. Тем не менее, это более описательный, чтобы сделать что-то вроде:
struct D2 {
int i {};
std::vector<int> coll;
D2(int const j) : i{j} {}
D2() = default;
};
Таким образом, вы можете прочитать , что вы включаете c'tor по умолчанию.
По моему опыту, полезно использовать default
всякий раз, когда нужно включить определение по умолчанию для конструкторов копирования и перемещения и операторов присваивания и определения по умолчанию для виртуальных деструкторов.
Короче говоря: Использования default
всякий раз, когда вам нужно включить c'tor или оператор присваивания, что компилятор в противном случае был бы подавить, или когда вам нужно определение по умолчанию для виртуального деструктора.
Посмотрите, что каждый делает и сравнивает. –
@LightnessRacesinOrbit, честно говоря, легко пропустить, что '= default' и полагаться на неявное объявление работает по-разному в присутствии других конструкторов. –
@ Revolver_Ocelot: легко пропустить, да; но сначала вам нужно провести некоторое исследование, чтобы иметь хоть какой-то шанс. –