На вас влияет раздел [class.default.ctor] p2 черновика стандарта C ++ (или [class.ctor] p5 в C ++ 11), в котором говорится:
Заданный по умолчанию конструктор по умолчанию для класса X определяется как удаленный, если:
...
- любой не вариантный нестатический элемент данных типа с определением констант (или массива)из них) без инициализации-скобки или равнозначного инициализатора не предусмотрен пользовательский конструктор по умолчанию,
...
Они могут стать ключом к решению вашей проблемы с помощью фразы без инициализатора скобок или равных , так что если вы предоставите инициализатор скобок или равных , который решит вашу проблему, например:
const int payments_per_year{12};
const int period_length_in_months{48};
скобка-or-equal-initializer не требует фигурных скобок, мы можем видеть эту грамматику:
brace-or-equal-initializer:
= initializer-clause
braced-init-list
, но использование равномерной инициализации имеет некоторые преимущества, такие как сужение преобразований, неправильно сформированных что стоит привыкнуть к их использованию.
Как gcc, так и clang предоставляют более значимые диагнозыТики для этого см. в прямом эфире Godbolt .Иногда бывает полезно попробовать свой код на нескольких компиляторах, особенно если у вас есть минимальный тестовый пример, например, такой как clang:
warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
Bond() = default;
^
note: default constructor of 'Bond' is implicitly deleted because field 'payments_per_year' of const-qualified type 'const int' would not be initialized
const int payments_per_year;
^
...