std:: optional
|
헤더에 정의됨
<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() 이 호출됩니다.
|
|
(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
객체 비교
(함수 템플릿) |
|
(C++17)
|
optional
객체 생성
(함수 템플릿) |
|
(C++17)
|
std::swap
알고리즘 특수화
(함수 템플릿) |
헬퍼 클래스
|
(C++17)
|
std::optional
에 대한 해시 지원
(클래스 템플릿 특수화) |
|
(C++17)
|
값을 포함하지 않는
std::optional
의 표시자
(클래스) |
|
(C++17)
|
값을 포함하지 않는 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
(클래스 템플릿) (커스터마이제이션 포인트 객체) |
|
|
(C++20)
|
요소가 없는 빈
view
(클래스 템플릿) (변수 템플릿) |