Namespaces
Variants

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

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変長引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
Swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
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> の公開メンバ関数)