optional — std::optional

optional — std::optional

std::optional 클래스 템플릿은 선택적(있을 수도 없을 수도 있는) 포함 값을 관리하는 타입이에요. C++17에서 도입됐어요. <optional> 헤더에 있어요.

값이 "있거나 없거나"를 표현해, 빈 값·실패를 명시적으로 나타낼 수 있어요.

출처: cppreference

본문

// <optional> 헤더, C++17
template< class T >
class optional;

사용 예

#include <optional>
#include <string>

std::optional<int> parseInt(const std::string& s) {
    if (s.empty()) return std::nullopt;   // 값 없음
    return std::stoi(s);                  // 값 있음
}

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

    auto b = parseInt("");
    if (!b) { }        // operator bool로 확인
    int safe = b.value_or(-1);   // -1 (기본값)
}

주요 연산

연산 설명
has_value() / operator bool 값을 가졌는지
*, value() 값 접근
value_or(v) 값 또는 기본값
emplace(args...) 배치 생성
reset() 값 제거
operator-> 값의 멤버 접근
swap() 교환

비교·전달

std::optional<int> a = 5;
if (a.value() == 5) { }
if (a > 3) { }   // 비교 가능

// 함수 인자·반환에 자주 사용
std::optional<std::string> maybe(const std::optional<std::string>& s);

특징

  • std::nullopt로 "값 없음"을 나타내요.
  • 스몰 버퍼 최적화 — 작은 T는 힙 할당 없이 저장.
  • 예외/오류 코드 대신 "결과가 없을 수 있음"을 타입으로 표현.
// 맵 조회
std::map<std::string,int> m;
auto it or result = /* optional로 감싸기 */;

std::optional은 "값이 있을 수도 없을 수도 있는" 선택형 데이터를 안전하고 명확하게 다루는 표준 타입이에요.

더 알아보기 (Learn more)

cppreference