2016-09-29 8 views
0

P0012R1에서 "예외 시스템을 시스템 유형에 포함 시키십시오."
이제는 noexcept이 함수 유형의 일부가되는 것을 볼 수 있습니다.noexcept 함수가 여전히 C++ 17에서 throw되는 함수를 호출 할 수 있습니까?

이렇게하면 noexcept(true) 함수가 noexcept(false) 함수를 계속 호출 할 수 없게되는지 여부를 알 수 없습니다.

다음 코드가 여전히 C++ 17에 유효합니까? 함수 타입의 예외 사양 포함

void will_throw() noexcept(false){ 
    throw 0; 
} 

void will_not_throw() noexcept(true){ 
    will_throw(); 
} 
+0

throw 함수가 noexcept 함수에서'try ... catch' 내부에 있다면 어떻게 될까요? –

+4

'noexcept'는 함수가 _ throw되지 않고 _cannot_ throw가 아니라는 것을 의미하며, 실패한 경우의 penalty는 UB가 아니라'std :: terminate'를 호출하는 것입니다. 그렇습니다. 그 코드는 합법적입니다. – ildjarn

답변

4

: 함수에 noexcept 사양은 컴파일 시간 체크 아니라고

참고; 이것은 프로그래머가 컴파일러에게 예외를 던져야하는지 여부를 알려주는 방법 일뿐입니다 ( ).

코드 구문이 유효하지만 실행될 때 std::terminate이 호출됩니다.

0

함수 (그 예외 명세서에 포함되어 있지 않은 예외를 처리하지 않고) 호환 예외 사양과 다른 함수를 호출 할 수 있는지 여부에 대해 직교이다. 전자는 함수 포인터와 관련하여 유형 안전성에 관한 것입니다 (따라서 던지지 않는 것으로 알려진 함수 포인터를 통해 던지는 함수를 호출 할 수는 없습니다). 후자에 관해서는 컴파일하는 동안 (Java에서와 같이) 금지하거나 런타임 오류로 취급 할 수 있습니다 (C++의 현재 표준에서 선택된 것처럼 프로그램이 종료 됨).

const (정적이지 않은) 멤버 함수에서 비 -(비 정적) 멤버 함수를 호출하는 것과 유사하다고 할 수 있습니다. 하지만 차이점은 const 멤버 함수를 통해 호출 된 비 -멤버 함수 내에서 간접적으로 객체를 수정하는 것이 감지되지 않게되거나 (너무 비싸고 탐지하기가 어려워) 불쾌한 버그를 유발할 수 있다는 것입니다. 편집. 예외를 던지는 행위는 예외적 인 사건이며 (예외적이어야 함) 예외가 예외 규정을 준수하는지 여부에 대한 런타임 검사를 삽입 할 수 있습니다. 예외가 풀리거나 프로그램 논리를 위반해야하며 대신 프로그램을 종료해야합니다. 프로그램. cppreference에 따르면

0

noexcept(true) 함수는 noexcept(false) 함수를 호출 할 수 있습니다. 예외가 발생하면 런타임 오류가 발생합니다. 이 허용되는 이유의 표준적인 예는 다음과 같습니다

double hypotenuse(double opposite, double adjacent) noexcept(true) 
{ 
    return std::sqrt(opposite*opposite + adjacent*adjacent); 
} 

std::sqrt 명확하게 결코 여기 것이다 인수가 음수 인 경우 domain_error를 던져,하지만 것입니다.

(이상적으로는 필요에 따라 exception_cast을 허용하면 기본적으로 금지되며 예외가 발생하면 UB가되거나 std :: terminate가 될 수 있습니다).