std::unreachable în C++

Îi spune compilatorului că un punct din cod nu poate fi atins niciodată, ca să optimizeze.

Sintaxă
#include <utility>
[[noreturn]] void unreachable();

Ce face std::unreachable

Pui std::unreachable() într-un loc pe care știi sigur că programul nu îl atinge, de exemplu pe ramura default a unui switch care tratează deja toate valorile posibile. Compilatorul poate apoi elimina verificări inutile.

Este o promisiune, nu o verificare: dacă execuția ajunge totuși acolo, comportamentul este nedefinit (programul poate face orice). Nu îl folosi pentru erori care pot apărea în realitate; pentru acelea aruncă o excepție.

Ce returnează

Nu returnează niciodată.

Exemple

Exemplul 1: Un switch care tratează toate cazurile

Funcția tratează toate cele trei valori ale enumerării, așa că ramura default nu este atinsă niciodată.

#include <print>
#include <utility>

enum class Semafor { Rosu, Galben, Verde };

const char* actiune(Semafor s) {
    switch (s) {
        case Semafor::Rosu: return "Stai";
        case Semafor::Galben: return "Atenție";
        case Semafor::Verde: return "Treci";
    }
    std::unreachable();
}

int main() {
    std::println("{}", actiune(Semafor::Verde));
    std::println("{}", actiune(Semafor::Rosu));
}

Rezultat

Treci
Stai

Greșeli frecvente

  • Îl folosești pentru date venite din afară (citite de la tastatură sau din fișier). O valoare neașteptată duce la comportament nedefinit, nu la o eroare clară. Verifică datele și aruncă o excepție.

Comenzi înrudite

  • switch, case, default: Alege una dintre mai multe ramuri după valoarea unei expresii întregi, a unui caracter sau a unui enum.
  • assert: Verifică o condiție care trebuie să fie mereu adevărată; dacă e falsă, oprește programul cu un mesaj.
  • std::terminate: Oprește imediat programul; este apelată automat când o excepție nu este prinsă nicăieri.