Hardconstexpr
Чем constexpr-инициализация static-переменных в шаблоне опасна?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Static-поле в шаблонном классе: каждая инстанциация получает свою static-переменную. Главная опасность — order of initialization между TU (classic static init fiasco).
template<class T>
struct Counter {
static inline int count = 0; // своя для Counter<int>, Counter<double>...
};
// Безопаснее — Meyers singleton (function-local static)
template<class T>
T& counter() { static T inst{}; return inst; }- C++17
inline staticрешает ODR (одно определение на программу), но порядок инициализации между TU остаётся проблемой; - Эксплицитная инстанциация шаблона гарантирует одно определение static-члена;
- Для констант —
constexpr inline static; для счётчиков — function-local static; - Не делать static-инициализацию, зависящую от runtime параметров.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.