2013-02-23 3 views
3

는 다음과 같은 코드를 가지고 : 그 소리의 SVN에서가상 클래스의 건설 nothrow C++ 11

#include <type_traits> 

struct X { virtual ~X(); }; 

static_assert(std::is_nothrow_default_constructible<X>::value, "fail"); 

, 그것은 잘 컴파일합니다. 그러나 gcc 4.7.2에서는 어설 션이 실패합니다. 어느 것이 옳은가요? (그리고 gcc가 맞다면, 왜?)

답변

3

clang이 맞습니다.

이에 대한 몇 가지 논쟁이 있었다,하지만 개체의 건설은 소멸자가 잠재적으로 호출로 발생합니다

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1424

그래서 std::is_nothrow_default_constructible<X>는 기본 생성자를 테스트뿐만 아니라 ~X()되지 않습니다.

기본적으로 ~X()에는 암시 적으로 noexcept이 적용됩니다. 예에서 ~X()을 비공개로 설정하거나 삭제하거나 noexcept(false)을 입력하면 static_assert이 실패합니다.

gcc 4.7.2가 소멸자가 암시 적으로 noexcept이라는 규칙을 아직 구현하지 않은 것으로 의심됩니다.

업데이트

나는 위의 대답하면서 CWG/LWG 문제의 스윕했으나 명백한 놓친 : 아래이 문제를 지적

덕분에 많은 카시오 네리에

http://cplusplus.github.com/LWG/lwg-active.html#2116 . 나 자신을 고르지 않은 Mea culpa. 내가 포함하는 정보가 아마도 도움이된다고 생각하는 것 외에는이 대답을 삭제할 것입니다. 카시오 네리 감사합니다.

+0

좋습니다. 소멸자 선언 후에'noexcept'를 작성하면 당분간 문제가 해결됩니다. –

+4

@Howard : std :: is_nothrow_default_constructible이 소멸자를 고려해야하는지 아닌지에 대해서는 실종 상태 일 수 있습니다. http://cplusplus.github.com/LWG/lwg-active.html#2116. LWG가 나보다 훨씬 잘 작동하는 방법을 확실히 이해하고 있습니다. 제 해석이 잘못되면 저를 바로 잡으십시오. (미리 감사드립니다.) 어쨌든,이 버그는 GCC에보고되었습니다 : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51452 (그러나 나에게) 그것은 보류 상태로되어 있습니다. std :: is_nothrow_default_constructible의 정의. –