std::expected<T,E>::operator bool, std::expected<T,E>::has_value
constexpr explicit operator bool() const noexcept; | (1) | (начиная с C++23) |
constexpr bool has_value() const noexcept; | (2) | (начиная с C++23) |
Проверяет, содержит ли *this ожидаемое значение.
Возвращаемое значение
Примечания
Объект std::expected никогда не бывает пустым. Если has_value() возвращает true, для доступа к ожидаемому значению можно использовать operator*(); в противном случае для доступа к неожиданному значению можно использовать error().
Пример
Пример можно проверить в Compiler Explorer.
#include <charconv>
#include <concepts>
#include <cstdint>
#include <expected>
#include <print>
#include <string>
#include <string_view>
#include <system_error>
#include <utility>
template<std::integral Int = int>
constexpr std::expected<Int, std::string> to_int(std::string_view str)
{
Int value{};
const auto [_, ec] = std::from_chars(str.data(), str.data() + str.size(), value);
if (ec == std::errc())
return value;
return std::unexpected{std::move(std::make_error_code(ec).message())};
}
int main()
{
if (auto result = to_int("42"); result.has_value())
std::println("{}", *result); // after the check it is safe to use operator*
else
std::println("{}", result.error());
if (const auto result = to_int("not a number"); result)
std::println("{}", *result);
else
std::println("{}", result.error());
if (const auto result{to_int<std::int16_t>("32768")}) // implicitly calls (1)
std::println("{}", *result);
else
std::println("{}", result.error());
}
Возможный вывод:
42 Invalid argument Numerical result out of range
См. также
| обращается к ожидаемому значению (открытая функция-член) |
|
| возвращает неожиданное значение (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/expected/operator_bool