2014-11-10 1 views
1

C++ 11은 기본적으로 소멸자를 noexcept으로 지정합니다. 내 noexcept 소멸자가 예외를 throw 할 수있는 사례를 신고하기 위해 Clang을 얻을 수있는 방법이 있습니까 (따라서 std::terminate)?`noexcept` 소멸자로부터 예외를 던질 때 Clang이 경고 할 수 있습니까?

+0

중단 문제를 해결 하시겠습니까? ** 예 **, 많은 오 검출을 ​​원하지 않는 한. 그리고 어쨌든, 규칙은 좀 더 복잡합니다. – Deduplicator

+0

@Deduplicator 예 중단 문제에 대한 해결책을 묻습니다. 확실하게 Turing과 현재 사이에 문제가 해결되어 C++ 11에서 발견 될 것입니다, 그렇지 않다면 14일까요?/s – fbrereto

+0

@Deduplicator 규칙에 대한 합병증은 무엇입니까? 이 특정 문제에 익숙하지는 않지만 예를 들어, 사용자에게 경고 신호를 보내기 위해 활용 될 수있는 'noexcept'소멸자에 대한 예외 처리 프레임 워크가 있다고 생각했습니다. – fbrereto

답변

1

먼저 C++에서는 기본적으로 소멸자를 noexcept으로 지정하지 않습니다.
noexcept(all subobjects destructors are noexcept)으로 지정합니다. 항상 반환

  1. 반환하지 마십시오, 반환 할 수 있습니다

    다음으로, 우리는 하나 개의 범주에 각각 표현과 문을 분류 할 수 있습니다.

  2. 결코 던지지 않고, 던지거나, 던지거나, 던지기를하지 마십시오.

모두 첫 번째 경우에만 예외적으로으로 표시됩니다.

좋은 결과를 얻으려면 컴파일러가 가능한 모든 상태에 대해 throwing식이 실행되었는지 여부를 결정할만큼 프로그램 동작을 충분히 분석 할 수 있어야합니다.

불가능한 시나리오에 대한 경고가 너무 많으면 만족스러운 결과를 얻을 수 있습니다.
반대로, 뻔뻔스러운 사례에 대해서만 경고하고 싶다면 어떤 결과가 나올 수도 있습니다.

문제는 모든 재미있는 경우가 the halting problem으로 해결됩니다.
아니요, 우리는 더 이상 함께하지 않습니다.

+1

clang ++는 둘 다 검사 할 수 있습니다. 결코 반환하지 않습니다 ('-Wmissing-noreturn'). 반환하지 않을 수도 있습니다 ('-Wreturn-type'). 또한'-Winvalid-noreturn'은'[[noreturn]] 함수에'return'이 없음을 검사합니다. 함수가'noexcept'로 표시되면 모든 코드 경로가 noexcept인지 점검 할 수 있습니다 (경고, 기본적으로 꺼짐). 'return '과의 차이점은 모든'return'은 함수 자체의 명시적인 문장이라는 것입니다. – dyp

+0

이렇게하면 noreturn 부분을 쉽게 확인할 수 있습니다 (모두 표시되어 있고 표시되지 않은 모든 함수 *가 * 리턴 됨). noexcept의 문제점은 너무 많은 가양 성을 원한다면 훨씬 더 분석되어야한다는 것입니다. – Deduplicator

+0

'noexcept' 규칙에 대한 설명을 고맙게 생각합니다. 감사합니다! – fbrereto