8Vysvětlete úrovně bezpečnosti proti výjimkám (exception safety) a jak `noexcept` ovlivňuje operace přesunu (move operations), kontejnery a generování kódu.
Úrovně bezpečnosti proti výjimkám popisují, co zůstává v platnosti, pokud operace vyhodí výjimku. Základní záruka (basic guarantee) znamená, že jsou zachovány invarianty a nedochází k úniku prostředků, ačkoli stav se mohl změnit. Silná záruka (strong guarantee) znamená sémantiku potvrzení nebo vrácení změn (commit-or-rollback): při selhání zůstává pozorovatelný stav nezměněn. Záruka nevyhození výjimky (nothrow guarantee) znamená, že operace výjimku nevyhodí. Běžné techniky zahrnují RAII (Resource Acquisition Is Initialization), provádění práce na dočasných objektech, idiom copy-and-swap a řazení mutací tak, aby k potvrzení (commit) došlo až po úspěšném dokončení práce, která může vyhodit výjimku. `noexcept` je kontrakt: pokud funkce s `noexcept` vyhodí výjimku, zavolá se `std::terminate`. Ovlivňuje také generický kód a kontejnery: například během realokace může `std::vector` přesouvat prvky, pokud je přesouvací konstruktor (move constructor) označen jako `noexcept`; v opačném případě je může kopírovat, často pomocí `std::move_if_noexcept`, aby se zachovaly záruky bezpečnosti proti výjimkám. `noexcept` může také pomoci při generování kódu nebo optimalizaci tím, že sníží počet potřebných cest pro šíření výjimek, ale pouze tehdy, když je tento slib dodržen.
Zkusit odpovědět na tuto otázku s trenérem AI
9Vysvětlete std::expected nebo ekvivalentní typy pro výsledky (outcome types) jako alternativy k výjimkám pro operace, které mohou selhat (fallible operations).
std::expected<T, E> představuje buď úspěšnou hodnotu T, nebo explicitní chybu E, čímž se selhání stává součástí návratového typu funkce namísto spoléhání se na propagaci výjimek. Je to užitečné pro operace, které mohou selhat, u nichž se chyby očekávají a volající by je měli lokálně zpracovat, jako je parsování, validace, síťová volání, vyhledávání v úložišti a backendové operace, které lze opakovat (retryable). Typ chyby by měl nést strukturované informace, jako je kód chyby, kategorie, možnost opakování, zpráva nebo mapování HTTP/RPC (Hypertext Transfer Protocol / Remote Procedure Call). Typy pro návrat úspěchu či chyby (expected/outcome) lze řetězit kontrolou a propagací chyb a v rozhraních API (Application Programming Interface) ve stylu C++23 mohou využívat monadické operace, jako jsou and_then, transform a or_else, ke spojování jednotlivých kroků bez hluboce zanořených podmínek. Ve srovnání s výjimkami zviditelňují řízení toku (control flow) a kontrakty API, přičemž dobře fungují i přes hranice kódu bez výjimek nebo hranice aplikačního binárního rozhraní ABI (Application Binary Interface); výjimky mohou být stále vhodné pro vzácná, nelokální nebo skutečně výjimečná selhání, v závislosti na pravidlech projektu.
Zkusit odpovědět na tuto otázku s trenérem AI