noexcept 키워드
• 함수가 예외가 있는지 없는지 조사
• 함수가 "예외 없음"을 표시
#include <iostream>
void f1() { }
void f2(int a, int b) { throw 1; }
int main()
{
bool b1 = noexcept(f1());
bool b2 = noexcept(f2(1, 2));
printf("%d %d\n", b1, b2); // ?
}
실제 함수 실행하는 것이 아니다.
함수 구현부까지 확인하는 것이 아니다.
그렇기에 f1 에서 예외가 없더라도 컴파일러는 알 수 있는 방법이 없다.

함수가 예외 없음을 알리려면
함수 선언 뒤에 noexcept 키워드를 붙인다.
#include <iostream>
void f1() noexcept { }
void f2(int a, int b) { throw 1; }
int main()
{
bool b1 = noexcept(f1());
bool b2 = noexcept(f2(1, 2));
printf("%d %d\n", b1, b2); // ?
}
결과적으로 noexcept 키워드는
해당 함수 선언 뒤에 "예외 없음" 이라고 선언되었는지 확인하는 용도라고 할 수 있다.
noexcept(true) / noexcept(false)
[예제]
noexcept 인자로 true/false 값을 줄 수 있다.
인자로 주어지는 표현식이 noexcept 인지 조사 가능하도록 하기 위함이다.
#include <iostream>
void foo() noexcept {}
void boo(int a) noexcept {}
void boo(double a) {}
template<typename T>
void foo(T arg) noexcept(noexcept(boo(arg)))
{
foo();
boo(arg);
}
int main()
{
printf("%d\n", noexcept(foo(1)));
printf("%d\n", noexcept(foo(1.2)));
}
void foo(T arg) noexcept(noexcept(boo(arg))) 에서
foo 는 noexcept(boo(arg)) 결과를 확인한다.
noexcept(boo(arg)) 전달되는 arg 타입에 따라 noexcept 여부가 결정된다.
int → noexcept(true)
double → noexcept(false)
Q) noexcept 붙은 함수에서 예외가 발생하면?
A) std::terminate 호출
Q) 왜 "예외 없음"을 알리는가?
A) 예외 여부에 따라 최적화 코드 작성 가능
ex) std::move_if_noexcept()
[예제]
#include <iostream>
void fast_algorithm()
{
// 성능은 좋지만 실패(예외) 가능성이 있음
printf("1...\n");
}
void slow_algorithm() noexcept
{
// 느리지만 실패하지 않음
printf("2...\n");
}
int main()
{
if (noexcept(fast_algorithm()))
{
fast_algorithm();
}
else
{
slow_algorithm();
}
}
개발 초기에는 불안정한 코드 보다 안전한 코드를 선택할 것이다.
하지만 개발 진행에 따라
fast_algorithm 안정성이 보장된다면
「void fast_algorithm() noexcept」 처리하면 된다.
📌 [C++] 오류 처리 방식 (Error Handling)
[C++] 오류 처리 방식 (Error Handling)
오류 처리 방식 (Error Handling)① 약속된 함수 반환값 ② 예외(Exception) 사용 ③ 성공/실패 결과가 모두 담을 수 있는 타입 반환 [예제]Connect 실패 시 어떻게 처리할 것인가?→ 프로세스 종
zoosso.tistory.com
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C/C++] 비트 필드 구조체 (8) | 2025.03.23 |
---|---|
[C++] RAII & stack unwinding (1) | 2025.03.19 |
[C++] 오류 처리 방식 (Error Handling) (3) | 2025.03.17 |
[C++] 깊은 복사 (Deep Copy) (2) | 2025.03.16 |
[C++] 함수 객체 (function object) (2) | 2025.03.15 |
댓글