Exceptions plus the guarantee vocabulary (basic/strong/nothrow); noexcept enters the type of the contract; std::error_code/system_error give non-throwing channels for expected failures.
std::expected<T, E> is the missing sum type for fallible operations, with monadic and_then/transform/or_else on both expected and optional for pipeline composition.
std::expected<Config, ParseError> parse(std::string_view src);
auto port = parse(src)
.transform([](const Config& c) { return c.port; })
.value_or(8080);
Contracts split bugs from recoverable errors: pre/post/contract_assert state what must hold, with ignore/observe/enforce semantics — assertions become a language feature with a violation handler, not a macro.
doublesafe_div(double a, double b)pre(b != 0.0){ contract_assert(std::isfinite(a)); return a / b; }
Direction: contracts on virtual functions and further semantics, plus pattern matching over expected/variant as the consumption syntax for value-based errors.
C++26 per the final working draft; C++29 rows are proposals and direction, not adopted features.