Namespaces
Variants

std::variant<Types...>:: valueless_by_exception

From cppreference.net
Utilities library
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 — 즉 위에 나열된 상황 중 하나에서 이전 예외로 인해 값을 갖지 않는 — 는 유효하지 않은 상태로 간주됩니다:

  • index variant_npos 를 반환
  • get bad_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

참고 항목

인덱스나 타입(타입이 고유한 경우)이 주어지면 variant의 값을 읽고, 오류 시 예외를 발생시킴
(함수 템플릿)
variant 가 보유한 대안의 0-기반 인덱스를 반환
(public 멤버 함수)
variant 값에 대한 잘못된 접근 시 발생하는 예외
(클래스)