@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 объект, но он был динамически инициализирован, и это вызвало проблему из-за "статического порядка инициализации фиаско")

Ответы на вопрос(1)

Ваш ответ на вопрос