Посмотрите на этот код:
struct NonConstexpr {
NonConstexpr() { }
};
template <typename T>
struct Bar {
NonConstexpr nonConstexpr;
constexpr Bar() { }
};
struct Foo {
Bar<void> bar;
constexpr Foo() { }
};
В этом коде конструктор Foo
помечен как constexpr
, но он не может появляться в константном выражении, так как фактически не удовлетворяетТребования этого.Вы можете прочитать подробности об этом в моем предыдущем вопросе .
Мой вопрос таков: могу ли я как-то обнаружить во время компиляции, что конструктор Foo
на самом деле не будет вести себя как constexpr
?
Причина, по которой я спрашиваю это, я хотел бы обнаружить, что глобальная переменная Foo
будет статически инициализирована или нет (я хотел бы поставить static_assert
на это, так какмой глобальный Foo
объект должен быть инициализирован статически).
Обратите внимание, что простое решение временно добавить constexpr
в переменную не работает, так как мой Foo
имеет нетривиальный деструктор.