2013-03-30 3 views
24

소멸자 및 noexcept과 약간 혼동합니다. 내 이해는 C++ 11에서는 사용자 정의를 포함하여 소멸자가 암시 적으로 noexcept(true)인데, 심지어 throw 인 경우에도 마찬가지입니다. 그리고 그들이 어떤 이유로 그것을 원한다면 명시 적으로 noexcept(false)을 지정해야합니다.소멸자 및 noexcept

나는 GCC 4.7.2에서 클래스와 소멸자가 얼마나 원시적이든지간에 사용자 정의 소멸자가 암시 적으로 noexcept(false)임을 알았습니다. 내가 여기서 무엇을 놓치고 있니? 사용자 정의 소멸자가있는 숨겨진 잡화가 있습니까?

+4

12.4/3 : "예외 스펙이없는 소멸자의 선언은 암시 적으로 간주됩니다 에 암시 적 선언 (15.4)과 동일한 예외 사양이 있어야합니다. " 즉 소멸자는 모든 멤버와베이스에 noexcept 소멸자가있는 경우에만 'noexcept (true)'입니다. – ipc

답변

16

이것은 known bug (버그보고를 찾는 OP에 크레디트)이며, GCC 4.8.0에서 수정 된 것 같습니다. 예를 들어, 아래의 정적 주장은 GCC 4.7.2에서 실행됩니다,하지만 GCC 4.8.0에 :

struct X 
{ 
    ~X() { }; 
}; 

int main() 
{ 
    X x; 

    // This will not fire even in GCC 4.7.2 if the destructor is 
    // explicitly marked as noexcept(true) 
    static_assert(noexcept(x.~X()), "Ouch!"); 
} 
+3

실제로 나는 "버그"를 추가 검색 키워드로 사용하지 않을 것이라고 생각했습니다. 이제 나는 (당신 덕택에) 이렇게되었다 [Bug 56191] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56191). 신속한 응답에 감사드립니다! – lapk

+0

@PetrBudnik : 링크를 가져 주셔서 감사합니다. 답변에 추가하겠습니다! –