std::expected<T,E>::error_or
From cppreference.com
template< class G = E >
constexpr E error_or( G&& default_value ) const&;
|
(1) | (since C++23) |
template< class G = E >
constexpr E error_or( G&& default_value ) &&;
|
(2) | (since C++23) |
Returns the unexpected value if it exists, otherwise returns default_value.
1) If
std::is_copy_constructible_v<E> or std::is_convertible_v<G, E> is false, the program is ill-formed.2) If
std::is_move_constructible_v<E> or std::is_convertible_v<G, E> is false, the program is ill-formed.Contents
Parameters
| default_value | - | the value to use in case *this does not contain an unexpected value
|
| Type requirements |
Return value
1)
has_value() ? std::forward<G>(default_value) : error()2)
has_value() ? std::forward<G>(default_value) : std::move(error())Example
Run this code
#include <cstdlib>
#include <expected>
#include <iostream>
#include <string>
#include <system_error>
std::expected<const char*, std::string> try_getenv(const char* name)
{
if (const char* env{std::getenv(name)})
return env;
return std::unexpected{std::make_error_code(std::errc::invalid_argument).message()};
}
int main()
{
for (auto env : {"SHELL", "OS"})
{
const auto ex{try_getenv(env)};
std::cout << env << ": " << ex.value_or("ERROR:") << ' ' << ex.error_or("(OK)") << '\n';
}
}
Possible output:
SHELL: /usr/bin/zsh (OK)
OS: ERROR: Invalid argument
See also
| returns the unexpected value (public member function) |