Namespaces
Variants

std:: optional

From cppreference.net
Utilities library
헤더에 정의됨 <optional>
template < class T >
class optional ;
(C++17부터)

클래스 템플릿 std::optional 는 선택적으로 포함된 값, 즉 존재할 수도 있고 존재하지 않을 수도 있는 값을 관리합니다.

optional 의 일반적인 사용 사례는 실패할 수 있는 함수의 반환 값입니다. std:: pair < T, bool > 과 같은 다른 접근 방식과 달리, optional 은 생성 비용이 높은 객체를 잘 처리하며 의도가 명시적으로 표현되어 가독성이 더 높습니다.

optional 의 모든 인스턴스는 특정 시점에 값을 포함하거나 값을 포함하지 않거나 둘 중 하나의 상태를 가집니다.

만약 optional 이 값을 포함하고 있다면, 그 값은 해당 optional 객체 내부에 중첩되어 있음이 보장됩니다. 따라서 optional 객체는 포인터가 아닌 객체를 모델링하며, 비록 operator*() operator->() 가 정의되어 있더라도 마찬가지입니다.

optional<T> 타입의 객체가 bool로 문맥적 변환 bool 될 때, 객체가 값을 포함하고 있으면 변환 결과가 true 를 반환하고 값을 포함하지 않으면 false 를 반환합니다.

optional 객체는 다음 조건에서 값을 포함합니다:

  • 객체는 T 타입의 값이나 값을 포함하는 다른 optional 로 초기화되거나 할당됩니다.

객체는 다음 조건에서 값을 포함하지 않습니다:

  • 객체가 기본 초기화됩니다.
  • 객체가 std::nullopt_t 타입의 값이나 값을 포함하지 않는 optional 객체로 초기화/할당됩니다.
  • 멤버 함수 reset() 이 호출됩니다.

optional 객체는 값이 포함된 경우 하나의 요소를 포함하고, 그렇지 않은 경우 0개의 요소를 포함하는 view 입니다. 포함된 요소의 수명은 객체에 바인딩됩니다.

(since C++26)

선택적 참조, 함수, 배열 또는 (cv 한정자가 있을 수 있는) void 타입은 존재하지 않습니다; 이러한 타입으로 optional 을 인스턴스화하는 프로그램은 형식 오류입니다. 또한, std::nullopt_t 또는 std::in_place_t 태그 타입들(가능하게 cv 한정된)로 optional 을 인스턴스화하는 프로그램도 형식 오류입니다.

목차

템플릿 매개변수

T - 초기화 상태를 관리할 값의 타입. 해당 타입은 Destructible 요구사항을 충족해야 합니다 (특히, 배열 및 참조 타입은 허용되지 않습니다).

중첩 타입

유형 정의
value_type T
iterator (C++26부터) 구현 정의 LegacyRandomAccessIterator , ConstexprIterator , 및 contiguous_iterator 이며, value_type reference 는 각각 std:: remove_cv_t < T > T & 입니다.
const_iterator (C++26부터) 구현 정의 LegacyRandomAccessIterator , ConstexprIterator , 및 contiguous_iterator 이며, value_type reference 는 각각 std:: remove_cv_t < T > const T & 입니다.

Container 에 대한 반복자 타입의 모든 요구사항은 optional iterator 타입에도 동일하게 적용됩니다.

데이터 멤버

T* val 포함된 객체에 대한 포인터 (존재하는 경우)
( 설명 전용 멤버 객체* )

멤버 함수

optional 객체를 생성합니다
(public member function)
포함된 값이 있는 경우 이를 파괴합니다
(public member function)
내용을 할당합니다
(public member function)
Iterators
(C++26)
시작 부분에 대한 반복자를 반환합니다
(public member function)
(C++26)
끝 부분에 대한 반복자를 반환합니다
(public member function)
Observers
포함된 값에 접근합니다
(public member function)
객체가 값을 포함하는지 확인합니다
(public member function)
포함된 값을 반환합니다
(public member function)
사용 가능한 경우 포함된 값을 반환하고, 그렇지 않으면 다른 값을 반환합니다
(public member function)
Monadic operations
(C++23)
값이 존재하는 경우 포함된 값에 대한 주어진 함수의 결과를 반환하고, 그렇지 않으면 빈 optional 을 반환합니다
(public member function)
(C++23)
값이 존재하는 경우 변환된 포함된 값을 담은 optional 을 반환하고, 그렇지 않으면 빈 optional 을 반환합니다
(public member function)
(C++23)
값이 포함된 경우 optional 자체를 반환하고, 그렇지 않으면 주어진 함수의 결과를 반환합니다
(public member function)
Modifiers
내용을 교환합니다
(public member function)
포함된 값이 있는 경우 이를 파괴합니다
(public member function)
포함된 값을 제자리에서 생성합니다
(public member function)

비멤버 함수

(C++17) (C++17) (C++17) (C++17) (C++17) (C++17) (C++20)
optional 객체 비교
(함수 템플릿)
optional 객체 생성
(함수 템플릿)
std::swap 알고리즘 특수화
(함수 템플릿)

헬퍼 클래스

std::optional 에 대한 해시 지원
(클래스 템플릿 특수화)
(C++17)
값을 포함하지 않는 std::optional 의 표시자
(클래스)
값을 포함하지 않는 optional에 대한 검증된 접근을 나타내는 예외
(클래스)

헬퍼

(C++17)
nullopt_t 타입의 객체
(상수)
인-플레이스 생성 태그
(태그)

헬퍼 특수화

template < class T >
constexpr bool ranges:: enable_view < std :: optional < T >> = true ;
(C++26부터)

이 특수화는 ranges::enable_view optional view 를 만족하도록 합니다.

template < class T >
constexpr auto format_kind < std :: optional < T >> = range_format :: disabled ;
(C++26부터)

format_kind 의 이 특수화는 optional 범위 형식 지정 지원 을 비활성화합니다.

추론 가이드

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_optional 201606L (C++17) std::optional
202106L (C++23)
(DR20)
완전한 constexpr
202110L (C++23) 모나딕 연산
__cpp_lib_optional_range_support 202406L (C++26) std::optional 의 범위 지원

예제

#include <iostream>
#include <optional>
#include <string>
// optional은 실패할 수 있는 팩토리의 반환 타입으로 사용될 수 있음
std::optional<std::string> create(bool b)
{
    if (b)
        return "Godzilla";
    return {};
}
// std::nullopt는 모든 (빈) std::optional을 생성하는 데 사용될 수 있음
auto create2(bool b)
{
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << '\n';
    // optional을 반환하는 팩토리 함수들은 while과 if의 조건으로 사용 가능함
    if (auto str = create2(true))
        std::cout << "create2(true) returned " << *str << '\n';
}

출력:

create(false) returned empty
create2(true) returned Godzilla

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 4141 C++17 저장소 할당 요구사항이
혼동스러웠음
포함된 객체는 반드시
optional 객체 내에
중첩되어야 함

참고 항목

(C++17)
타입 안전 식별 합집합
(클래스 템플릿)
(C++17)
CopyConstructible 타입의 인스턴스를 보유하는 객체
(클래스)
(C++23)
예상 값 또는 오류 값을 포함하는 래퍼
(클래스 템플릿)
지정된 값의 단일 요소를 포함하는 view
(클래스 템플릿) (커스터마이제이션 포인트 객체)
요소가 없는 빈 view
(클래스 템플릿) (변수 템플릿)