Namespaces
Variants

std::experimental:: scope_fail

From cppreference.net

헤더 파일에 정의됨 <experimental/scope>
template < class EF >
class scope_fail ;
(라이브러리 펀더멘털 TS v3)

클래스 템플릿 scope_fail 는 예외를 통해 스코프가 종료될 때 해당 종료 함수를 호출하도록 설계된 범용 스코프 가드입니다.

scope_fail CopyConstructible , CopyAssignable 또는 MoveAssignable 요구사항을 만족하지 않습니다. 그러나 EF 가 특정 요구사항을 충족하는 경우 MoveConstructible 일 수 있으며, 이는 scope_fail 을 다른 객체로 래핑하는 것을 허용합니다.

A scope_fail 는 활성 상태, 즉 소멸 시 종료 함수를 호출하거나, 비활성 상태, 즉 소멸 시 아무 작업도 수행하지 않을 수 있습니다. scope_fail 은 종료 함수로부터 생성된 후 활성 상태입니다.

A scope_fail 는 수동으로 또는 자동으로(이동 생성자에 의해) release() 를 호출하여 비활성화될 수 있습니다. 비활성 scope_fail 은 다른 비활성 scope_fail 으로 초기화하여 얻을 수도 있습니다. 일단 scope_fail 이 비활성화되면 다시 활성화될 수 없습니다.

A scope_fail 는 효과적으로 EF 와 활성화 상태를 나타내는 bool 플래그를 보유하며, 스택 풀기 중에 소멸자가 호출되는지 감지하는 데 사용되는 미처리 예외 카운터와 함께 동작합니다.

목차

템플릿 매개변수

EF - 저장된 종료 함수의 유형
유형 요구 사항
-
EF 는 다음 중 하나여야 합니다:
-
인수 없이 std:: remove_reference_t < EF > 의 좌측값을 호출하는 것이 올바르게 형성되어야 합니다.

멤버 함수

새로운 scope_fail 을 생성합니다
(public member function)
scope_fail 이 활성 상태일 때 예외를 통해 스코프가 종료되면 exit 함수를 호출한 후 scope_fail 을 파괴합니다
(public member function)
operator=
[deleted]
scope_fail 은 할당할 수 없음
(public member function)
Modifiers
scope_fail 을 비활성 상태로 만듭니다
(public member function)

추론 가이드

참고 사항

동적 저장 기간의 scope_fail 을 생성하면 예기치 않은 동작이 발생할 수 있습니다.

다른 스레드에서 생성된 scope_fail 으로부터 scope_fail 을 구성하는 것은 파괴 과정에서 다른 스레드에서 얻은 미처리 예외의 개수가 비교될 수 있으므로 예기치 않은 동작을 초래할 수도 있습니다.

예제

#include <iostream>
#include <cstdlib>
#include <string_view>
#include <experimental/scope>
void print_exit_status(std::string_view name, bool exit_status, bool did_throw) {
  std::cout << name << ":\n";
  std::cout << "  Throwed exception  " << (did_throw ? "yes" : "no") << "\n";
  std::cout << "  Exit status        " << (exit_status ? "finished" : "pending") << "\n\n";
}
// 무작위로 예외를 발생시킴 (50% 확률)
void maybe_throw() {
    if (std::rand() >= RAND_MAX / 2)
        throw std::exception{};
}
int main() {
  bool exit_status{false}, did_throw{false};
  // "스코프 종료 시" 수동 처리
  try {
    maybe_throw();
    exit_status = true; 
  } catch (...) { did_throw = true; }
  print_exit_status("Manual handling", exit_status, did_throw);
  // scope_exit 사용: 스코프 종료 시 실행 (성공 또는 예외 발생 시)
  exit_status = did_throw = false;
  try {
    auto guard = std::experimental::scope_exit{[&]{ exit_status = true; } };
    maybe_throw();
  } catch (...) { did_throw = true; }
  print_exit_status("scope_exit", exit_status, did_throw);
  // scope_fail 사용: 예외 발생 시에만 실행
  exit_status = did_throw = false;
  try {
    auto guard = std::experimental::scope_fail{[&]{ exit_status = true; } };
    maybe_throw();
  } catch (...) { did_throw = true; }
  print_exit_status("scope_fail", exit_status, did_throw);
  // scope_success 사용: 예외가 발생하지 않을 때만 실행
  exit_status = did_throw = false;
  try {
    auto guard = std::experimental::scope_success{[&]{ exit_status = true; } };
    maybe_throw();
  } catch (...) { did_throw = true; }
  print_exit_status("scope_success", exit_status, did_throw);
}

출력:

Manual handling:
  Throwed exception  yes
  Exit status        pending
scope_exit:
  Throwed exception  no
  Exit status        finished
scope_fail:
  Throwed exception  yes
  Exit status        finished
scope_success:
  Throwed exception  yes
  Exit status        pending

참고 항목

함수 객체를 감싸고 스코프를 벗어날 때 호출합니다
(class template)
함수 객체를 감싸고 스코프를 정상적으로 벗어날 때 호출합니다
(class template)
unique_ptr 의 기본 삭제자
(class template)