2013-03-30 8 views
24

Jestem trochę zmieszany z destruktorami i noexcept. Rozumiem, że w C++ 11 każdy destruktor, w tym zdefiniowany przez użytkownika, jest domyślnie noexcept(true), nawet jeśli my go od niego otrzymamy throw. I trzeba wyraźnie określić, noexcept(false), jeśli z jakiegoś powodu chcą, aby tak było.Destruktory i noexcept

To, co widzę, jest całkiem odwrotne - z GCC 4.7.2, zdefiniowany przez użytkownika destruktor, bez względu na to, jak prymitywna jest klasa i destruktor, jest domyślnie noexcept(false). Czego tu mi brakuje? Czy jest jakiś ukryty błąd z destruktorami zdefiniowanymi przez użytkownika?

+4

12,4/3: „Oświadczenie o destructor, że nie ma wyjątków specyfikacją uważany jest niejawnie mieć taką samą specyfikację wyjątku, co domyślne zgłoszenie (15.4). " to znaczy, destruktor jest tylko "noexcept (true)", jeśli wszystkie elementy i bazy mają destruktor noexcept. – ipc

Odpowiedz

16

To jest known bug (przypisuje OP za znalezienie raportu o błędzie) i wygląda na to, że został naprawiony w GCC 4.8.0. Na przykład twierdzenie statyczna poniżej zadziała na GCC 4.7.2, ale nie na 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

Właściwie nie pomyślałem o używaniu "błędu" jako dodatkowego słowa kluczowego wyszukiwania. Teraz, kiedy to zrobiłem (dzięki tobie), pojawił się [Bug 56191] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56191). Dzięki za szybką odpowiedź! – lapk

+0

@PetrBudnik: Dziękuję za link, dodam go do odpowiedzi! –

Powiązane problemy