std::expected<T,E>::operator bool, std::expected<T,E>::has_value

来自cppreference.com
< cpp‎ | utility‎ | expected
 
 
 
 
constexpr explicit operator bool() const noexcept;
(1) (C++23 起)
constexpr bool has_value() const noexcept;
(2) (C++23 起)

检查 *this 是否表示预期值。

返回值

has_val

注解

一个 std::expected 对象永远不会无值。如果 has_value() 返回 true,那么可以用 operator*() 访问预期值;否则,可以用 error() 访问非预期值。

示例

#include <charconv>
#include <concepts>
#include <cstdint>
#include <expected>
#include <print>
#include <string>
#include <string_view>
#include <system_error>
 
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); // 经检查后,使用 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")}) // 隐式调用了 (1)
        std::println("{}", *result);
    else
        std::println("{}", result.error());
}

可能的输出:

42
Invalid argument
Numerical result out of range

参阅

访问预期值
(公开成员函数)
返回非预期值
(公开成员函数)
检查对象是否含值
(std::optional<T> 的公开成员函数)