Gdzie mogę znaleźć wszystkie gwarancje wyjątków dla standardowych kontenerów i algorytmów?

Tak, przejrzałem standardy C++ , które mogłem znaleźć (lub wersje robocze), ale nie znajduję żadnych wyczerpujących gwarancji WYJĄTKÓW udzielanych przez kontenery STL. Jedyne co mogę znaleźć to sporadyczne sekcje z niekompletnymi opisami na niektórych funkcji dla niektórych typów. A może tam jest, ale po prostu tego nie znajduję, Nie wiem.

Note: I ' m NIE Prośba o listę wszystkich gwarancji, które ludzie mogą myśleć z, który jest w zasadzie w to pytanie .
Szukam autorytatywnego źródła samej informacji -- a najlepiej darmowej wersji źródła (np. szkicu standardu), gdzie mogę mniej więcej traktować jako oficjalne.

Author: Community, 2012-07-28

3 answers

Czytanie standardu może być przerażające( wróćmy do standardu), ale Bjarne Stroustrup napisał bardzo ładny dodatek na ten temat w swojej książce " język programowania C++". Zamieścił ten dodatek w

Http://www.stroustrup.com/3rd_safe0.html , at http://www.stroustrup.com/3rd_safe.pdf

Jest dość długa i szczegółowa (i dobrze napisana). Na przykład sekcja E. 4 może Cię zainteresować, cytuję:

E. 4 Standard Gwarancja Kontenera

Jeśli operacja biblioteki sama rzuca wyjątek, może-i robi – upewnij się, że obiekty, na których działa, pozostają w dobrze zdefiniowany stan. Na przykład at () wyrzuca out_of_range dla wektor (§16.3.3) nie stanowi problemu z bezpieczeństwem wyjątków dla wektora . Autor at() nie ma problemu z upewnieniem się, że wektor jest w dobrze zdefiniowany stan przed rzucaniem.

Ponadto sekcja E. 4. 1 stwierdza

Oprócz gwarancji podstawowej biblioteka standardowa oferuje silna gwarancja na kilka operacji wkładania lub usuwania elementów.

Spójrz na stronę 956. Zawiera tabelę gwarancji dla różnych operacji dla vector, deque, list i map. podsumowując, wszystkie operacje na tych kontenerach są albo nieostre, albo silne, z wyjątkiem N-element insert into map, który oferuje podstawowe gwarancje.

Uwaga: Powyższy tekst jest stary i nie odnosi się do C++11, ale nadal powinien być wystarczająco poprawny dla większości celów i celów.

Jeśli chodzi o C++11...

Standard pierwszy stwierdza, o pojemnikach array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack: at

23.2.1/10:

O ile nie określono inaczej (zob. 23.2.4.1, 23.2.5.1, 23.3.3.4, oraz 23.3.6.5) wszystkie typy kontenerów zdefiniowane w niniejszym punkcie spełniają następujące dodatkowe wymagania:

- jeśli wyjątek jest wyrzucany przez funkcję insert () lub emplace () while wstawianie pojedynczego elementu, funkcja ta nie ma żadnych efektów.
- jeśli wyjątek jest wyrzucany przez funkcję push_back () lub push_front (), ta funkcja nie ma żadnych efektów.
- funkcja no erase(), clear(), pop_back() lub pop_front() rzuca wyjątek.
- brak konstruktora kopiującego lub operatora przypisania zwracanego iteratora rzuca wyjątek.
- żadna funkcja swap() nie wyświetla wyjątku.
- funkcja no swap() unieważnia wszelkie referencje, wskaźniki lub Iteratory odnosi się do elementów zmienianych kontenerów.

Dziwactwa wskazane w odpowiednich sekcjach, o których mowa powyżej (każda zwana gwarancją bezpieczeństwa WYJĄTKÓW) dotyczą głównie specjalnych przypadków przeciwko ścianie, takich jak w przypadku WYJĄTKÓW z zawartych typów' hashing, operacje porównawcze, jak również operacje swap i throwing move.

 14
Author: Johan Lundberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 18:08:26

N3376

23.2.1 Ogólne wymagania dotyczące kontenerów [kontener.wymagania.ogólne]

Paragraf 10

O ile nie określono inaczej (zob. 23.2.4.1, 23.2.5.1, 23.3.3.4 i 23.3.6.5) wszystkie typy kontenerów zdefiniowane w niniejszym punkcie spełniają następujące dodatkowe wymagania:
- jeśli podczas wstawiania pojedynczego elementu zostanie wyrzucony wyjątek przez funkcję insert() lub emplace (), funkcja ta nie będzie miała żadnych efektów.
- jeśli wyjątek jest wyrzucany przez push_back () lub funkcja push_front (), funkcja ta nie ma żadnych efektów.
- funkcja no erase(), clear(), pop_back() lub pop_front() wyświetla wyjątek.
- żaden Konstruktor kopiujący lub operator przypisania zwracanego iteratora nie rzuca wyjątku.
- żadna funkcja swap() nie wyświetla wyjątku.
- funkcja no swap() unieważnia wszelkie odwołania, wskaźniki lub Iteratory odnoszące się do elementów zamienianych kontenerów.
[Uwaga: iterator end() nie odnosi się do żadnego elementu, więc może być unieważnione. - endnote]

23.2.4 kontenery asocjacyjne [asocjacyjne.reqmts]

23.2.4.1 gwarancje bezpieczeństwa WYJĄTKÓW [asocjacyjne .reqmts.except]

1 dla kontenerów asocjacyjnych, żadna funkcja clear () nie rzuca wyjątku. erase (k) nie wyrzuca wyjątku, chyba że jest on wyrzucany przez obiekt porównania kontenera (jeśli istnieje).
2 dla kontenerów asocjacyjnych, jeśli wyjątek jest wyrzucany przez jakąkolwiek operację wewnątrz funkcji insert lub emplace wstawiając pojedynczy element, wstawianie nie ma żadnego efektu.
3 w przypadku kontenerów asocjacyjnych żadna funkcja swap nie rzuca wyjątku, chyba że wyjątek ten jest wyrzucany przez zamianę obiektu porównania kontenera (jeśli istnieje).

23.2.5 nieuporządkowane kontenery asocjacyjne [unord.req]

23.2.5.1 gwarancje bezpieczeństwa WYJĄTKÓW [unord.req.except]

1 dla nieuporządkowanych kontenerów asocjacyjnych, żadna funkcja clear () nie rzuca wyjątku. erase (k) nie wyrzuca wyjątku chyba że ten wyjątek jest wyrzucany przez obiekt Hash lub Pred kontenera (jeśli istnieje).
2 w przypadku nieuporządkowanych kontenerów asocjacyjnych, jeśli wyjątek jest wyrzucany przez jakąkolwiek operację inną niż funkcja hash kontenera z wewnątrz funkcji insert lub emplace wstawiającej pojedynczy element, wstawianie nie ma żadnego efektu.
3 w przypadku nieuporządkowanych kontenerów asocjacyjnych, żadna funkcja swap nie rzuca wyjątku, chyba że wyjątek ten jest wyrzucany przez zamianę obiektu Hash lub Pred kontenera (jeśli istnieje).
4 W przypadku nieuporządkowanych kontenerów asocjacyjnych, jeśli wyjątek jest wyrzucany z funkcji rehash() innej niż funkcja mieszająca kontenera lub funkcja porównująca, funkcja rehash() nie ma wpływu.

23.3.3.4 modyfikatory deque [deque.modyfikatory]

Void push_back (T&& x); paragraf 2

Uwagi: jeśli wyjątek jest wyrzucany inaczej niż przez Konstruktor kopiujący, konstruktor przeniesienia, operator przypisania lub operator przeniesienia przypisania T, nie ma żadnych efektów. Jeśli wyjątek jest wyrzucany przez konstruktor move nie-CopyInsertable T, efekty są nieokreślone.

Iterator erase( const_iterator pierwszy, const_iterator ostatni); paragraf 6

Throws: nic, chyba że wyjątek jest wyrzucany przez Konstruktor kopiujący, konstruktor ruchu, operator przypisania lub operator przypisania ruchu T.

23.3.6.5 modyfikatory wektorowe [wektor.modyfikatory]

Void push_back (T&& x); paragraf 2

Jeśli wyjątek jest wyrzucane przez konstruktor move nie-CopyInsertable T, efekty są nieokreślone.

Iterator erase( const_iterator pierwszy, const_iterator ostatni); paragraf 5

Throws: nic, chyba że wyjątek jest wyrzucany przez Konstruktor kopiujący, konstruktor ruchu, operator przypisania lub operator przypisania ruchu T.

 8
Author: Martin York,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-28 08:27:58

Dokument, z którym się połączyłeś, projekt standardu n3337, może być traktowany jako oficjalny. Jest to standard C++11 plus drobne zmiany redakcyjne.

Musisz tylko nauczyć się czytać standard, co jest zrozumiałe, ponieważ nie jest przeznaczone do łatwego czytania.

Aby znaleźć Gwarancje wyjątków dla konkretnej operacji bibliotecznej, sprawdź specyfikację tej operacji pod kątem uwag i komentarzy dotyczących WYJĄTKÓW. Jeśli funkcja jest funkcją członową to sprawdź specyfikację typu dla uwag dotyczących bezpieczeństwa wyjątków i wymagań, jakie spełnia. Następnie sprawdź spełnione wymagania dla gwarancji wyjątków, które muszą być wykonane przez obiekty, aby spełnić te wymagania.

W przypadku typów generycznych i algorytmów sprawdź również wymagania stawiane parametrom szablonu, aby sprawdzić, jakie wymagania te typy muszą spełniać, aby wszystkie gwarancje WYJĄTKÓW złożone przez typ, algorytm lub funkcję członka były utrzymywane (jeśli parametry szablonu nie spełniaj określonych wymagań wtedy użycie szablonu z tymi parametrami Ma nieokreślone zachowanie i żadna ze specyfikacji szablonu nie ma zastosowania).

 2
Author: bames53,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-28 20:25:20