2013-08-20 3 views
0

C++ 11 Spec (n3485) 섹션 5.3.7을 보면 note 3은 noexcept (expr)의 결과가 false 인 경우 다음과 같이 나타냅니다.noexcept (expression) - expression이 실제로 throw하는 noexcept 함수 인 경우

... 비 던져 예외 지정 ... 잠재적으로 평가 된throw-expression ... 잠재적으로 평가 된 dynamic_cast가없는 잠재적으로 평가 된 함수 ...를 호출합니다. .. 잠재적으로 평가 된 typeid 표현식 ...

"잠재적으로 평가되는 ted "는 그것이 드릴 다운된다는 것을 의미합니다 (전혀 아닙니다? 약간?) 조건 중 하나가 거짓이 될 수 있는지 결정하기 위해?

나는 (응용 프로그램이 아닌 테스트 코드에서) noexcept라고 주장하는 함수를 찾고 있지만, 실제로 모든 경우에도 예외는 여전히 noexcept로 간주됩니다. 사양을 오해하고 있거나 다음 예제의 코드가 모두 잘못 되었습니까?

double calculate(....) noexcept { throw "haha"; } // using simpsons::nelson 

bool does_not_throw = noexcept(calculate()); 

이 테스트에서는 calculate()가 throw하지 않는다고 말합니다.

+1

'noexcept'는 "이 함수 나 물건에 던져 넣을 수있는 것은 아무것도 없다"는 뜻이 아니며 "이 함수를 벗어나는 예외는 없다는 것을 당신에게 보장하는 언어"를 의미합니다. 만약 필요하다면, 런타임은'noexcept' 함수를 벗어나는 예외를 허용하는 대신에 프로그램을'std :: terminate'로 종료시킴으로써 그 보장을 시행 할 것입니다. (C++ 11 15.4/9) – Casey

+0

@Casey : +1, 감사합니다. – Arbalest

답변

0

식의 조건이 예외를 throw하는지 확인하려면식이 무엇인지 확인해야합니다. 잠재적으로 호출 될 실제 코드는 확인하지 않습니다. 표현식 용어 중 하나가 명시 적으로 noexcept이 아닌 함수 호출이면 예외를 throw 할 수 있다고 가정합니다.

다른 식으로 말하면 표현식에서 호출 된 모든 함수가 noexcept인지 확인합니다. 그게 다야.

Clang 3.3에 따르면이 테스트에서는 calculate()가 throw하지 않는다고 말합니다.

사실입니다. calculatenoexcept으로 정의되었으므로 예외를 발생 시키려면 std::terminate이 호출됩니다. 따라서 함수에 의해 예외가 발생하지 않습니다.