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