Załóżmy, że mam:Jaka jest specyfikacja wyjątku dla domyślnego wirtualnego destruktora w C++ 11?
class Foo
{
public:
virtual ~Foo()=default;
};
Co jest wyjątkiem specyfikacją na niewykonaniem destructor? Czy defaulted destructor równoważne:
virtual ~Foo() {};
or
virtual ~Foo() throw() {};
or
virtual ~Foo() noexcept {};
rozdziale 15.4 standardu C++ 11 mówi, że to zależy od specyfikacji wyjątkiem funkcji bezpośrednio powoływane przez niejawny definicji destruktor jest. W tym przypadku nie ma żadnych członków i klas podstawowych, więc AFAIK nie ma żadnych funkcji bezpośrednio wywoływanych przez niejawny destruktor. Czy jest to niejednoznaczność (lub pominięcie) w standardzie?
Ma to znaczenie, ponieważ jeśli niejawnie ma throw(), wówczas wszystkie podklasy muszą zadeklarować swoje destruktory za pomocą throw(). Nie mów mi, że to zły pomysł na wyrzucanie wyjątków w destruktorach, wiem o tym. Mam do czynienia z dużą ilością starszego kodu, w którym specyfikacje wyjątków nie były w ogóle używane.
Jako punkt informacji, kiedy próbowałem:
class SubFoo : public Foo
{
public:
virtual ~SubFoo();
};
mam błąd (niedopasowane specyfikację wyjątku) w GCC 4.4 (chociaż muszę przyznać, że nie może mieć przełączniki linii poleceń po prawej), ale nie w XCode 4.3 przy użyciu kompilatorów "11".
Dziękuję za odpowiedź. Aby śledzić nieco więcej, specyfikacja mówi: "Deklaracja destruktora, który nie ma specyfikacji wyjątków, jest domyślnie uważana za zawierającą tę samą specyfikację wyjątku co domyślna deklaracja" Tak więc "virtual ~ SubFoo();" (bez wyjątku spec) nie jest źle sformułowany, chyba że bezpośrednio wywołuje funkcje, które pośrednio lub jawnie pozwalają na rzucanie? – user1414050
@ user1414050: Uważam, że to prawda, tak - ale my " dostaję się na tyle zakątków języka, że nie postawiłbym zbyt wiele na większość kompilatorów, co jest w tej chwili poprawne. W szczególności, podejrzewam, że wiele (większość?) kompilatorów traktuje 'virtual ~ SubFoo();' w znaczeniu "może rzucać cokolwiek ", tak jak przy normalnej funkcji –
Myślę, że ten wniosek może nie mieć, ponieważ" jeśli i tylko jeśli "jest sprzeczne z następującym zdaniem częściowym dotyczącym allowin g wszystkie wyjątki (to jest standard tutaj jest sprzeczny). I myślę, że to jest wątpliwe, czy intencją jest, aby destruktory domyślnie nie miały rzutu. Ponieważ byłoby to niezgodne z C++ 03. –