std::experimental:: scope_fail
|
헤더 파일에 정의됨
<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
는 다음 중 하나여야 합니다:
|
||
|
-
|
||
멤버 함수
새로운
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) |
|
|
(C++11)
|
unique_ptr
의 기본 삭제자
(class template) |