@StoryTeller: хорошо, спасибо, прочитав эту цитату несколько раз + ваш комментарий, теперь я понимаю, что происходит. Но теперь я не могу понять логику, лежащую в основе этого: «не удается удовлетворить требования к конструктору ... constexpr, эта специализация по-прежнему остается конструктором ... constexpr». Какая? Почему?
трите на этот код:
struct NonConstexpr {
NonConstexpr() { }
};
template <typename T>
struct Bar {
NonConstexpr nonConstexpr;
constexpr Bar() { }
};
struct Foo {
Bar<void> bar;
constexpr Foo() { }
};
Foo
имеет члена,Foo::bar::nonConstexpr
, который имеет конструктор non-constexpr. Итак, я ожидаю, что это не должно компилироваться. Но он компилируется с gcc, clang и msvc. Это ошибка компилятора, или какое-то правило позволяет компилировать этот код?
Если я добавлюNonConstexpr
член вFoo
напрямую, код больше не компилируется
(Я получил эту проблему, потому что я ожидал статическую инициализацию для глобальнойFoo
объект, но он был динамически инициализирован, и это вызвало проблему из-за "статического порядка инициализации фиаско")