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_oro 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șteor_else(C++23) sau unif.
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.