Ответ 1
Это ошибка clang и gcc, у нас есть отчет об ошибке clang: инициализатор члена по умолчанию для 'm', необходимый в определении включающего класса для аргумента функции по умолчанию, который имеет следующий пример:
#include <limits>
class A
{
public:
class B
{
public:
explicit B() = default;
~B() = default;
private:
double m = std::numeric_limits<double>::max();
};
void f(double d, const B &b = B{}) {}
};
int main()
{
A a{};
a.f(0.);
}
который производит следующую похожую диагностику:
t.cpp(15,34): error: default member initializer for 'm' needed within definition of enclosing class 'A' outside of member functions
void f(double d, const B &b = B{}) {}
^
t.cpp(12,20): note: default member initializer declared here
double m = std::numeric_limits<double>::max();
^
Ричард Смит указывает, что это ошибка:
Что касается комментария № 0: если мы хотим исправить это раз и навсегда, мы должны использовать тот же метод, который мы используем для отложенного синтаксического анализа шаблона: научить Sema перезванивать в синтаксический анализатор для анализа отложенных областей по требованию. Тогда мы бы только отвергли случаи, когда существует реальный цикл зависимости.
Хотя не объясняет почему в деталях.