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