Pergunta

Sim, eu olhei para o Padrões de C++ que eu poderia encontrar (ou rascunhos), mas não estou encontrando qualquer abrangente da exceção garantias dadas pelo contentores STL.Tudo o que posso encontrar são ocasionais seções com descrições incompletas no alguns de funções para alguns dos tipos.Ou talvez ele está lá, mas só não estou achando, eu não sei.

Nota: Eu sou não pedindo uma lista de todas as garantias que as pessoas podem pensar, que é, basicamente, na esta pergunta.
Eu estou olhando para o fonte autoritativa esta informação si-ou, de preferência, uma versão gratuita de origem (e.g.um projecto de norma) onde eu posso mais ou menos tratar como oficial.

Foi útil?

Solução

Lendo o padrão pode ser assustador (vamos voltar para o padrão), mas Bjarne Stroustrup tem escrito muito bom apêndice sobre este assunto em seu livro " A Linguagem de Programação C++'.Ele postou isso no apêndice

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

É muito longa e detalhada (e bem escrito).Você pode, por exemplo, encontrar a secção E. 4 interessante, e passo a citar:

E. 4 Contêiner Padrão Garantias

Se uma biblioteca própria operação lança uma exceção, ele pode – e faz – certifique-se de que os objetos sobre os quais opera são deixados em um bem-definidos pelo estado.Por exemplo, em() jogando out_of_range para um vetor (§16.3.3) não é um problema com exceção de segurança para o vetor .O escritor do at() não tem problema nenhum, certificando-se que um vector é um bem-estado definido antes de atirar.

Além disso, a seção E. 4.1 membros

Além da garantia básica, a biblioteca padrão oferece a forte garantia para algumas operações que inserir ou remover elementos.

dê uma olhada na página 956.Ele contém uma tabela de garantias para operações de vetor, deque, lista e o mapa.Em resumo, todas as operações em que os contentores são nothrow ou forte, exceto para N - elemento de inserir no mapa o que oferece as garantias fundamentais.

Nota:o texto acima é antigo e não o endereço de C++11, mas ainda deve ser correto o suficiente para a maioria dos objetivos e fins.

Quando ele vem para C++11...

o primeiro padrão estados, sobre os contentores array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack:no

23.2.1/10:

A menos que especificado de outra forma (ver 23.2.4.1, 23.2.5.1, 23.3.3.4, e 23.3.6.5) todos os tipos de contêineres definido nesta Cláusula cumprir os seguintes requisitos adicionais:

— se uma exceção é lançada por um insert() ou inserção de função() enquanto a inserção de um único elemento, que a função não tem efeito.
— se uma exceção é lançada por um push_back() ou push_front() função, essa função não tem efeito.
— não apagar(), clear(), pop_back() ou pop_front() função lança um exceção.
— nenhum construtor de cópia ou o operador de atribuição de um ex-iterador lança uma exceção.
— não há permuta de função() lança uma exceção.
— não há permuta() função invalida quaisquer referências, ponteiros, ou os iteradores referindo-se aos elementos de contêineres que estão sendo trocados.

As peculiaridades apontadas nas respectivas seções mencionadas acima (cada chamada Exceção de garantias de segurança) são em sua maioria sobre o especial de contra-a-parede casos, como quando lidar com as exceções do contido tipos de hash, operações de comparação, bem como arremesso de permuta e jogando operações de movimentação.

Outras dicas

N3376

23.2.1 Requisitos de contêineres gerais [contêiner.Requirements.General]

parágrafo 10

.

Salvo indicação em contrário (ver 23.2.4.1, 23.2.5.1, 23.3.3.4 e 23.3.6.5) Todos os tipos de contêineres definidos nesta cláusula atendem aos seguintes requisitos adicionais: - Se uma exceção for lançada por uma função Insert () ou emplace () durante a inserção de um único elemento, essa função não tem efeitos.
- Se uma exceção for lançada por uma função Push_back () ou Push_front (), essa função não tem efeitos.
- sem apagar (), claro (), pop_back () ou função pop_front () lança uma exceção.
- Nenhum construtor de cópia ou operador de atribuição de um iterador retornado lança uma exceção.
- Nenhuma função swap () lança uma exceção.
- Nenhuma função de swap () invalida quaisquer referências, ponteiros ou iteradores referentes aos elementos dos contêineres serem trocados.
[Nota: O iterador final () não se refere a nenhum elemento, por isso pode ser invalidado. -Endnote]

23.2.4 Recipientes Associativos [Assistive.Reqmts]

23.2.4.1 Garantias de segurança de exceção [associative.reqmts.except]

.

1 para contêineres associativos, nenhuma função clara () lança uma exceção. Apagar (k) não joga uma exceção a menos que essa exceção seja lançada pelo objeto Compare do contêiner (se houver).
2 Para contêineres associativos, se uma exceção for lançada por qualquer operação de dentro de uma função de inserção ou emplá, inserindo um único elemento, a inserção não tem efeito.
3 Para contêineres associativos, nenhuma função de swap lança uma exceção, a menos que essa exceção seja lançada pela swap do objeto Compare do contêiner (se houver).

23.2.5 Recipientes associativos não ordenados [Unord.Req]

23.2.5.1 Garantias de segurança de exceção [Unford.req.except]

.

1 para recipientes associativos não encomendados, nenhuma função clara () lança uma exceção. Apagar (k) não joga uma exceção a menos que essa exceção seja lançada pelo hash ou objeto anterior do recipiente (se houver).
2 Para contêineres associativos não ordenados, se uma exceção for lançada por qualquer operação diferente da função Hash do contêiner de dentro de uma função de inserção ou emplar, inserindo um único elemento, a inserção não tem efeito.
3 Para contêineres associativos não ordenados, nenhuma função de swap lança uma exceção, a menos que essa exceção seja lançada pela troca do objeto Hash ou PRED do recipiente (se houver).
4 para recipientes associativos não ordenados, se uma exceção for lançada de dentro de uma função de reash () diferente da função de hash ou função de comparação do contêiner, a função ReHash () não tem efeito.

23.3.3.4 modificadores de Deque [Deque.Modificadores]

vácuo push_back (t && x); Parágrafo 2

.

Observações: Se uma exceção for lançada diferente do construtor de cópia, mova o construtor, operador de atribuição ou mova o operador de atribuição de T não há efeitos. Se uma exceção é lançada pelo construtor de movimento de um T não copiincontável, os efeitos não são especificados.

iTerator apagamento (const_iterator primeiro, const_iterator por último); Parágrafo 6

.

lances: nada a menos que uma exceção seja lançada pelo construtor de cópia, mova o construtor, operador de atribuição ou mova o operador de atribuição de t.

23.3.6.5 modificadores de vetor [Vector.Modificadores]

vácuo push_back (t && x); Parágrafo 2

.

Se uma exceção for lançada pelo construtor de movimento de um T não-copiológica, os efeitos não são especificados.

iTerator apagamento (const_iterator primeiro, const_iterator por último); Parágrafo 5

.

lances: nada a menos que uma exceção seja lançada pelo construtor de cópia, mova o construtor, operador de atribuição ou mova o operador de atribuição de t.

O documento que você vinculou, o padrão N3337 padrão, pode ser tratado como oficial. É o padrão C ++ 11 Plus Minor Altersas Editoriais.

Você só precisa aprender a ler o padrão, o que é compreensível porque não se destina a ser fácil de leitura.

Para encontrar as garantias de exceção para qualquer operação de biblioteca específica, verifique se a especificação da operação para observações e comentários sobre exceções. Se a função for uma função de membro, verifique a especificação do tipo para comentários sobre segurança de exceção e quais requisitos que cumprem. Em seguida, verifique os requisitos atendidos para garantias de exceção que devem ser feitos por objetos para cumprir esses requisitos.

para tipos genéricos e algoritmos também verifique os requisitos colocados nos parâmetros de modelo para ver quais requisitos esses tipos precisam atender para todas as garantias de exceção feitas pelo tipo ou algoritmo ou função de membro para segurar (se o modelo Os parâmetros não atendem aos requisitos especificados, o uso do modelo com esses parâmetros possui comportamento indefinido e nenhuma das especificações do modelo se aplicam).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top