noexcept
operator
(since C++11)
noexcept 연산자는 컴파일 타임 검사를 수행하여 표현식이 어떤 예외도 발생시키지 않도록 선언된 경우 true 를 반환합니다.
이는 함수 템플릿의 noexcept 지정자 내에서 사용되어, 함수가 특정 타입에 대해서는 예외를 발생시키지만 다른 타입에 대해서는 그렇지 않음을 선언하는 데 사용될 수 있습니다.
목차 |
구문
noexcept(
expression
)
|
|||||||||
bool 타입의 prvalue 를 반환합니다. 결과는 expression 의 potential exceptions 집합이 비어 있는 경우 (C++17 이전) expression 이 non-throwing 으로 지정된 경우 (C++17 이후) true 이고, 그렇지 않으면 false 입니다.
expression 는 평가되지 않는 피연산자 입니다.
|
만약 expression 이 prvalue인 경우, temporary materialization 이 적용됩니다. |
(since C++17) |
참고 사항
noexcept ( expr ) 가 true 일지라도, 정의되지 않은 동작을 만나게 되는 결과로 expr 의 평가는 여전히 예외를 발생시킬 수 있습니다.
|
만약 expression 이 클래스 타입이거나 (다차원일 수 있는) 배열인 경우, 임시 구체화는 소멸자가 삭제되지 않고 접근 가능해야 합니다. |
(since C++17) |
키워드
예제
#include <iostream> #include <utility> #include <vector> void may_throw(); void no_throw() noexcept; auto lmay_throw = []{}; auto lno_throw = []() noexcept {}; class T { public: ~T(){} // 소멸자가 이동 생성자를 방지함 // 복사 생성자는 noexcept임 }; class U { public: ~U(){} // 소멸자가 이동 생성자를 방지함 // 복사 생성자는 noexcept(false)임 std::vector<int> v; }; class V { public: std::vector<int> v; }; int main() { T t; U u; V v; std::cout << std::boolalpha << "may_throw() is noexcept(" << noexcept(may_throw()) << ")\n" "no_throw() is noexcept(" << noexcept(no_throw()) << ")\n" "lmay_throw() is noexcept(" << noexcept(lmay_throw()) << ")\n" "lno_throw() is noexcept(" << noexcept(lno_throw()) << ")\n" "~T() is noexcept(" << noexcept(std::declval<T>().~T()) << ")\n" // 참고: 다음 테스트들은 ~T()가 noexcept이어야 함을 요구합니다 // noexcept 내부의 표현식이 임시 객체를 생성하고 파괴하기 때문입니다 "T(rvalue T) is noexcept(" << noexcept(T(std::declval<T>())) << ")\n" "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n" "U(rvalue U) is noexcept(" << noexcept(U(std::declval<U>())) << ")\n" "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n" "V(rvalue V) is noexcept(" << noexcept(V(std::declval<V>())) << ")\n" "V(lvalue V) is noexcept(" << noexcept(V(v)) << ")\n"; }
출력:
may_throw() is noexcept(false) no_throw() is noexcept(true) lmay_throw() is noexcept(false) lno_throw() is noexcept(true) ~T() is noexcept(true) T(rvalue T) is noexcept(true) T(lvalue T) is noexcept(true) U(rvalue U) is noexcept(false) U(lvalue U) is noexcept(false) V(rvalue V) is noexcept(true) V(lvalue V) is noexcept(false)
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 2722 | C++17 |
expression
이 prvalue인 경우
임시 구체화가 적용되는지 불명확했음 |
이 경우에도
적용됨 |
| CWG 2792 | C++11 |
noexcept
연산자가 정의되지 않은 동작이 발생하는 경우
예외 발생 여부를 판단해야 했음 |
요구되지 않음 |
참고 항목
noexcept
지정자
(C++11)
|
함수가 예외를 발생시킬 수 있는지 여부를 지정함 |
| 동적 예외 지정 (C++17까지) | 함수가 어떤 예외를 발생시키는지 지정함 (C++11에서 사용 중단됨) |