std::variant<Types...>:: valueless_by_exception
From cppreference.net
C++
Utilities library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::variant
| Member functions | ||||
| Observers | ||||
|
variant::valueless_by_exception
|
||||
| Modifiers | ||||
| Visitation | ||||
|
(C++26)
|
||||
| Non-member functions | ||||
| Helper classes | ||||
| Helper objects | ||||
|
constexpr
bool
valueless_by_exception
(
)
const
noexcept
;
|
(C++17부터) | |
variant이 값을 보유하고 있는 경우에만 false 를 반환합니다.
참고 사항
variant은 다음과 같은 상황에서 포함된 값을 초기화할 때 가치를 잃을 수 있습니다:
- (보장됨) 이동 할당 중 예외가 발생하는 경우
- (선택적) 복사 할당 중 예외가 발생하는 경우
- (선택적) 타입 변경 할당 중 예외가 발생하는 경우
-
(선택적) 타입 변경
emplace중 예외가 발생하는 경우
variant는 동적 메모리 할당이 절대 허용되지 않으므로, 이러한 상황에서 이전 값을 유지하거나 복원할 수 없습니다. "optional" 경우에는 타입이 예외를 발생시키지 않는 이동 연산을 제공하고 구현이 스택에 새 값을 먼저 생성한 후 variant로 이동하는 경우 예외 발생을 피할 수 있습니다.
이는 비클래스 타입의 변형에도 적용됩니다:
struct S { operator int() { throw 42; } }; std::variant<float, int> v{12.f}; // 정상 v.emplace<1>(S()); // v가 값을 가지지 않을 수 있음
valueless by exception 상태의 variant — 즉 위에 나열된 상황 중 하나에서 이전 예외로 인해 값을 갖지 않는 — 는 유효하지 않은 상태로 간주됩니다:
-
indexvariant_npos를 반환 -
getbad_variant_access를 throw -
visit및 멤버visit(C++26부터)bad_variant_access를 throw
예제
이 코드 실행
#include <cassert> #include <iostream> #include <stdexcept> #include <string> #include <variant> struct Demo { Demo(int) {} Demo(const Demo&) { throw std::domain_error("copy ctor"); } Demo& operator= (const Demo&) = default; }; int main() { std::variant<std::string, Demo> var{"str"}; assert(var.index() == 0); assert(std::get<0>(var) == "str"); assert(var.valueless_by_exception() == false); try { var = Demo{555}; } catch (const std::domain_error& ex) { std::cout << "1) Exception: " << ex.what() << '\n'; } assert(var.index() == std::variant_npos); assert(var.valueless_by_exception() == true); // 이제 var는 "값 없음" 상태이며, 이는 타입 변경 할당 과정에서 발생한 // 예외로 인해 발생한 유효하지 않은 상태입니다. try { std::get<1>(var); } catch (const std::bad_variant_access& ex) { std::cout << "2) Exception: " << ex.what() << '\n'; } var = "str2"; assert(var.index() == 0); assert(std::get<0>(var) == "str2"); assert(var.valueless_by_exception() == false); }
가능한 출력:
1) Exception: copy ctor 2) Exception: std::get: variant is valueless
참고 항목
|
(C++17)
|
인덱스나 타입(타입이 고유한 경우)이 주어지면 variant의 값을 읽고, 오류 시 예외를 발생시킴
(함수 템플릿) |
variant
가 보유한 대안의 0-기반 인덱스를 반환
(public 멤버 함수) |
|
|
(C++17)
|
variant
값에 대한 잘못된 접근 시 발생하는 예외
(클래스) |