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 핵심 기능이에요.