Вообще круто получилось, благодарю! 👍
А в чём разница между static_assert и throw внутри constexpr функции тогда? Не придётся ли мне потом это исключение ещё и в рантайме ловить?
static_assert требует constexpr аргументов (следовательно работает только в компайл-тайме)
throw для известных во время компиляции значений работает как static_assert, иначе бросает исключение в рантайме.
ловить придётся, если объекты будут создаваться в рантайме (а конструкции для автоматического создания только компайл-таймовых объектов нет, нужно ручками писать constexpr
)