Ответ 1
На вас влияет раздел [class.default.ctor] p2 проекта стандарта C++ (или [class.ctor] p5 в C++ 11), в котором говорится:
По умолчанию конструктор по умолчанию для класса X определяется как удаленный, если:
...
- любой не вариантный нестатический член данных типа с константным типом (или его массив) без инициализатора скобок или равенства не имеет предоставленного пользователем конструктора по умолчанию,
...
Возможно, ключом к решению вашей проблемы является фраза без инициализации-скобки или равных-инициализаторов, поэтому, если вы предоставите инициализатор скобок-или-равных, которая решит вашу проблему, например:
const int payments_per_year{12};
const int period_length_in_months{48};
Brace-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;
^
...