2015-03-27 5 views
8

C++ 11 (i C++ 14) Kontenery STL mają funkcje składowe noexcept i clear().Czy elementy kontenera STL są wyraźnie wymagane, aby być (nie tylko) podatne na destrukcję?

Oznacza to, że elementy powinny mieć również destruktory noexcept lub przynajmniej faktyczne elementy przechowywane w kontenerach nie powinny generować żadnych wyjątków po zniszczeniu - lub bardziej poprawnie, że odpowiednie wywołanie allocator_traits<Allocator>::destroy nie powinno zostać wywołane.

Czy jest to określone jako wymaganie (jednoznacznie lub dorozumiane przez inne wyraźne wymaganie) w dowolnym miejscu standardu? Jeśli nie, dlaczego?

Wiem, że is_nothrow_constructible wymaga destruktora noexcept, ale nie dotyczy to samego noexcept, a wymagania kontenera są określone raczej w kategoriach pojęć niż szablonów znaków.

+0

Destruktor kontenera może przechwytywać i ignorować wszelkie wyjątki z destruktora elementu. –

Odpowiedz

7

17.6.4.8/1 W niektórych przypadkach (funkcje zamiennych, funkcjach obsługi, operacje na typach stosowanych do instancji standardowych biblioteki komponentów szablonu), C++ biblioteki standardowej zależy od komponentów dostarczanych przez program C++. Jeśli te komponenty nie spełniają swoich wymagań, Standard nie nakłada żadnych wymagań na implementację .

17.6.4.8/2 W szczególności, efekty są niezdefiniowane w następujących przypadkach:

...

  • jeśli funkcja zastępcza lub funkcja obsługi lub eksploatacji destructor wyjście poprzez wyjątek , chyba że jest to wyraźnie dozwolone w wymaganym zachowaniu: paragraf.
+0

Hm ... Właśnie sobie uświadomiłem: musi istnieć podobny wymóg dla podzielników dostarczanych przez użytkownika, prawda? Czy istnieje? –

+0

W ** 17.6.3.5 ** tabela 28, wpis dla 'allocate' mówi" 'allocate' może podnieść odpowiedni wyjątek."; pozycja dla 'dealokowania' mówi:" Nie wyrzuca wyjątków od . " Czy o to pytasz? –

+0

Ah, racja! Tak, właśnie o to mi chodziło, dziękuję. Z jakiegoś powodu nie przyszło mi do głowy szukać tej tabeli w tej sekcji. –

Powiązane problemy