Domanda

Sì, ho guardato il Gli standard C ++ che potevo trovare (o le bozze), ma non sto trovando alcuna completa delle garanzie di eccezione fornite dai contenitori STL.Tutto quello che posso trovare sono sezioni occasionali con descrizioni incomplete su alcuni delle funzioni per alcuni dei tipi.O forse è lì ma non lo sto trovando, non lo so.

Nota: I'm non chiedendo un elenco di tutte le garanzie che le persone possono pensare, il che è fondamentalmente in Questa domanda .
Sto cercando Autorevole fonte di queste informazioni stesso - o preferibilmente, una versione gratuita della fonte (ad esempio una bozza dello standard) in cui posso più o meno il trattamento come ufficiale.

.
È stato utile?

Soluzione

Lettura dello standard può essere spaventoso (torniamo allo standard), ma Bjarne Stroustrup ha scritto un'appendice davvero bella su questo argomento nel suo libro 'il linguaggio di programmazione C ++ ". Ha pubblicato questa appendice a

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

È piuttosto lungo e dettagliato (e ben scritto). Ad esempio, puoi trovare la sezione E.4 Interessante, citazione:

.

E.4 Container standard garantisce

Se un'operazione di libreria stessa lancia un'eccezione, può - e lo fa - Assicurarsi che gli oggetti su cui opera siano lasciati in a stato ben definito. Ad esempio, a () buttare fuori_of_range per a Vettore (§16.3.3) non è un problema con la sicurezza delle eccezioni per il vettore . Lo scrittore di AT () non ha problemi a garantire che un vettore sia in a Stato ben definito prima del lancio.

Inoltre, Sezione E.4.1 Stati

.

Oltre alla garanzia di base, la Biblioteca Standard offre il Forte garanzia per alcune operazioni che inseriscono o rimuovono elementi.

Dai un'occhiata a pagina 956. Contiene una tabella delle garanzie per varie operazioni per vettoriali, deque, elenco e mappa. In sintesi, tutte le operazioni su quei contenitori non sono noco o forti, ad eccezione di n - elemento inserire in mappa che offre le garanzie di base.

Nota: il testo sopra è vecchio e non affronta C ++ 11, ma dovrebbe ancora essere abbastanza corretto per la maggior parte degli obiettivi e scopi.

Quando si tratta di C ++ 11 ...

I primi stati standard, sui contenitori array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack: A

23.2.1 / 10 :

.

se non diversamente specificato (vedere 23.2.4.1, 23.2.5.1, 23.3.3.4, e 23.3.6.5) Tutti i tipi di container definiti in questa clausola soddisfano i seguenti requisiti aggiuntivi:

- Se un'eccezione viene lanciata da una funzione di insert () o emplace () mentre Inserimento di un singolo elemento, quella funzione non ha effetti.
- Se un'eccezione viene lanciata da una funzione push_back () o push_front (), quella funzione non ha effetti.
- Nessuna cancellazione (), chiara (), pop_back () o pop_front () Funzione lancia un Eccezione.
. - nessun costruttore di copia o operatore di assegnazione di un iteratore restituito getta un'eccezione.
- Nessuna funzione Swap () lancia un'eccezione.
- Nessuna funzione di swap () invalida eventuali riferimenti, puntatori o Iteratori che si riferiscono agli elementi dei contenitori scambiati.

Le quinte indicate nelle rispettive sezioni di cui sopra (ciascuna denominata garanzie di sicurezza delle eccezioni) sono per lo più circa custodie speciali contro i muro come quando si tratta di eccezioni dal hashing dei tipi contenuti, delle operazioni di confronto e dello swap di lancio e lanciare le operazioni di mossa.

Altri suggerimenti

n3376

23.2.1 Requisiti del contenitore generale [container.requirements.General]

Paragrafo 10

.

Se non diversamente specificato (vedere 23.2.4.1, 23.2.5.1, 23.3.3.4 e 23.3.6.5) Tutti i tipi di container definiti in questa clausola soddisfano i seguenti requisiti aggiuntivi:
- Se un'eccezione viene lanciata da una funzione Insert () o EmPlace (), mentre inserisce un singolo elemento, quella funzione non ha effetti.
- Se un'eccezione viene lanciata da una funzione push_back () o push_front (), quella funzione non ha effetti.
- Nessuna cancellazione (), chiara (), pop_back () o pop_front () La funzione genera un'eccezione.
- Nessun costruttore di copia o operatore di assegnazione di un iteratore restituito genera un'eccezione.
- Nessuna funzione Swap () lancia un'eccezione.
- Nessuna funzione di swap () invalida eventuali riferimenti, puntatori o iteratori che si riferiscono agli elementi dei contenitori scambiati.
[Nota: l'iteratore END () non si riferisce a nessun elemento, quindi potrebbe essere invalidato. -Endnote]

23.2.4 Contenitori associativi [Associative.reqmts]

23.2.4.1 Eccezione Garanzie di sicurezza [associative.reqmts.ecept]

.

1 Per i contenitori associativi, nessuna funzione chiara () lancia un'eccezione. Cancella (K) non genera un'eccezione a meno che tale eccezione non venga lanciata dall'oggetto Confronto del contenitore (se presente).
2 Per i contenitori associativi, se viene generata un'eccezione da qualsiasi operazione da una funzione di inserimento o emlace che inserisce un singolo elemento, l'inserimento non ha alcun effetto.

3 Per i contenitori associativi, nessuna funzione di scambio lancia un'eccezione a meno che tale eccezione venga lanciata dallo scambio dell'oggetto Confronto del contenitore (se presente).

23.2.5 Contenitori associativi non ordinati [UNORD.REQ]

23.2.5.1 Guida di sicurezza delle eccezioni [UNORD.REQ.EXPET]

.

1 Per i contenitori associativi non ordinati, nessuna funzione chiara () lancia un'eccezione. Cancella (K) non getta un'eccezione a meno che tale eccezione non venga lanciata dall'ash obsole del contenitore (se presente).
2 Per i contenitori associativi non ordinati, se un'eccezione viene lanciata da qualsiasi operazione diversa dalla funzione HASH del contenitore da una funzione di inserimento o EMPLACE che inserisce un singolo elemento, l'inserimento non ha alcun effetto.

3 Per i contenitori associativi non ordinati, nessuna funzione di swap lancia un'eccezione a meno che tale eccezione sia lanciata dall'interruttore dell'hash o dell'oggetto predista del contenitore (se presente). 4 Per i contenitori associativi non ordinati, se un'eccezione viene lanciata da una funzione Rehash () diversa dalla funzione HASH o dalla funzione di confronto del contenitore, la funzione Rehash () non ha alcun effetto.

23.3.3.4 Deque Modificatori [Deque.modificatori]

void push_back (t && x); Paragrafo 2

.

Note: Se un'eccezione viene lanciata diversa dalla copia costruttore, spostare il costruttore, l'operatore di assegnazione o il muovimento dell'operatore di assegnazione di T non ci sono effetti. Se viene generata un'eccezione dal costruttore di mossa di un T non copianti, gli effetti non sono specificati.

ERASE ITERATORE (COST_ITARY PRIMA, CONST_ITERATOR ULTIMO); Paragrafo 6

.

Gruppi: nulla a meno che non venga lanciata un'eccezione dal costruttore di copia, spostare il costruttore, l'operatore di assegnazione o il muovimento dell'operatore di assegnazione di T.

23.3.6.5 Modificatori vettoriali [vettore.modificatori]

void push_back (t && x); Paragrafo 2

.

Se un'eccezione viene lanciata dal costruttore di mossa di un T non copianti, gli effetti non sono specificati.

ERASE ITERATORE (COST_ITARY PRIMA, CONST_ITERATOR ULTIMO); Paragrafo 5

.

Gruppi: nulla a meno che non venga lanciata un'eccezione dal costruttore di copia, spostare il costruttore, l'operatore di assegnazione o il muovimento dell'operatore di assegnazione di T.

Il documento che hai collegato, il Draft Standard N3337 può essere trattato come ufficiale. È il C ++ 11 standard più modifiche editoriali.

Hai solo bisogno di imparare a leggere lo standard, che è comprensibile perché non è destinato a leggere facilmente.

Per trovare le garanzie di eccezione per qualsiasi particolare funzionamento della biblioteca, verificare che le specifiche del funzionamento per osservazioni e commenti sulle eccezioni. Se la funzione è una funzione membro, controlla quindi le specifiche del tipo per i commenti sulla sicurezza delle eccezioni e quali requisiti soddisfano. Quindi controllare i requisiti soddisfatti per le garanzie di eccezione che devono essere effettuate da oggetti per soddisfare tali requisiti.

Per tipi e algoritmi generici controllano anche i requisiti posizionati sui parametri del modello per vedere quali requisiti devono soddisfare tali tipi di soddisfare in ordine per tutte le garanzie di eccezione effettuate dal tipo o dall'algoritmo o dalla funzione membro da tenere (se il modello I parametri non soddisfano i requisiti specificati, quindi utilizzare il modello con tali parametri ha un comportamento indefinito e nessuna delle specifiche del modello si applicano).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top