expected — std::expected

expected — std::expected

std::expected 클래스 템플릿은 T 또는 오류 E를 담는 타입이에요. C++23에서 도입됐어요. <expected> 헤더에 있어요.

"성공하면 값, 실패하면 오류"를 명시적으로 표현해, 예외나 오류 코드를 대체할 수 있어요 (함수형 오류 처리).

출처: cppreference

본문

// <expected> 헤더, C++23
template< class T, class E >
class expected;                          // (1) 값 보유

template< class T, class E >
    requires std::is_void_v<T>
class expected<T, E>;                    // (2) void 특수화 (void() 반환)

사용 예

#include <expected>
#include <string>

std::expected<int, std::string> parse(const std::string& s) {
    if (s.empty()) return std::unexpected("empty input");   // 오류
    return std::stoi(s);                                     // 성공 값
}

int main() {
    auto r1 = parse("42");
    if (r1.has_value()) {
        int n = *r1;   // 42
    }

    auto r2 = parse("");
    if (!r2.has_value()) {
        std::string err = r2.error();   // "empty input"
    }
}

주요 멤버

멤버 설명
has_value() 값 보유 여부
operator*, value() 값 접근
error() 오류 접근
value_or(v) 값 또는 대체값
and_then() 성공 시 계속 호출 (C++23)
or_else(), transform() 함수형 조합 (C++23)

함수형 조합

auto r = parse("42")
    .and_then([](int n) -> std::expected<int, std::string> {
        return n * 2;
    });
if (r) { /* 84 */ }

std::unexpected

#include <expected>

std::expected<int, int> make(int x) {
    if (x < 0) return std::unexpected(x);   // 오류 생성
    return x;
}

의도

std::expected는 성공/실패를 값으로 표현해서, 예외를 쓰지 않으면서도 실패 정보를 명확히 전달해요. 반환 값이 "무시되어도 되는가"를 컴파일 타임에 표시할 수도 있어요.

std::expected는 오류 처리에서 예외나 에러 코드의 안전한 대안으로 떠오르는 C++23 핵심 기능이에요.

더 알아보기 (Learn more)

cppreference