The working subset: -fno-exceptions -fno-rtti, static allocation, placement new over pools, templates instead of virtuals where codegen must be predictable.
static std::aligned_storage_t<sizeof(Driver), alignof(Driver)> slot;
Driver* drv = new (&slot) Driver(cfg);
Relaxed constexpr moves lookup tables from flash-init code to compile time.
if constexpr handles per-board variants without macros; string_view points at flash-resident text with zero RAM cost.
constinit guarantees flash-friendly initialization, <bit> covers register math, concepts constrain HAL templates — all exception-free by nature.
constinit RingBuffer<Event, 32> isr_queue;
Freestanding expands formally (P1642 pulls much of <utility>, <ranges>, <expected> in): std::expected is the sanctioned error channel where exceptions are off.
std::expected<Frame, ErrC> read_frame();
std::inplace_vector is the standard fixed-capacity container the ETL crowd always had privately; freestanding coverage keeps growing.
std::inplace_vector<Client, MAX_CLIENTS> clients;
C++29direction · not adopted
Direction: further freestanding expansion and (speculatively) profile-based subsets for safety-critical toolchains.