std::optional::value în C++

value() citește valoarea și aruncă excepție dacă optional e gol; value_or() dă o valoare implicită.

Sintaxă
T& value();
template<class U>
T value_or(U&& implicit) const&;

Ce face std::optional::value

o.value() returnează valoarea din optional. Dacă optional-ul este gol, aruncă std::bad_optional_access, deci eroarea se observă imediat, în loc de comportament nedefinit ca la *o.

o.value_or(implicit) returnează valoarea, sau implicit dacă optional-ul este gol. Nu aruncă nimic și este cea mai scurtă formă pentru „folosește valoarea, altfel X”.

Parametri

Parametru Descriere
implicit Pentru value_or: valoarea returnată când optional-ul este gol.

Ce returnează

value(): o referință la valoare. value_or(): o copie a valorii sau valoarea implicită.

Exemple

Exemplul 1: value_or pentru setări

#include <optional>
#include <print>
#include <string>

std::optional<std::string> limbaSetata(bool setata) {
    if (setata) return "en";
    return std::nullopt;
}

int main() {
    std::println("Limba: {}", limbaSetata(true).value_or("ro"));
    std::println("Limba: {}", limbaSetata(false).value_or("ro"));
}

Rezultat

Limba: en
Limba: ro

Exemplul 2: value() pe un optional gol

Textul din what() depinde de implementarea bibliotecii standard.

#include <optional>
#include <print>

int main() {
    std::optional<double> pret;
    try {
        std::println("Preț: {}", pret.value());
    } catch (const std::bad_optional_access& e) {
        std::println("Eroare: {}", e.what());
    }
    pret = 19.99;
    std::println("Preț: {}", pret.value());
}

Rezultat

Eroare: bad_optional_access
Preț: 19.99

Greșeli frecvente

  • Dai lui value_or o expresie costisitoare (de exemplu un apel de funcție care citește un fișier). Expresia este calculată mereu, chiar dacă optional-ul are valoare. Pentru calcul doar la nevoie, folosește or_else (C++23) sau un if.

Comenzi înrudite

  • std::optional: O valoare care poate lipsi: conține fie un obiect de tip T, fie nimic (std::nullopt).
  • std::optional::and_then: Înlănțuiește operații pe un optional: and_then și transform rulează funcția doar dacă există valoare.
  • try, catch: try marchează codul care poate arunca o excepție, iar blocurile catch prind și tratează excepțiile de un anumit tip.