std::optional — value that may not exist:
1std::optional<int> find(int key) {2 if (auto it = map.find(key); it != map.end())3 return it->second;4 return std::nullopt;5}67if (auto val = find(42)) {8 std::cout << *val;9}
std::variant — type-safe union:
1std::variant<int, std::string, double> v = "hello";23// std::get4std::string s = std::get<std::string>(v);56// std::visit7std::visit([](auto&& arg) {8 std::cout << arg;9}, v);
Benefits over alternatives:
optional vs null pointers/flagsvariant vs unions/inheritance