Uma pilha pode ter um método seguro de exceção para devolver e remover o elemento superior com a semântica do movimento?

StackOverflow https://stackoverflow.com/questions/2620357

Pergunta

Em uma resposta a uma pergunta sobre std::stack::pop() Eu afirmei esse é o motivo pop não retorna o valor é para a razão de segurança de exceção (o que acontece se o construtor de cópia lança).

@Konrad Comentou que agora, com a semântica do Move, isso não é mais relevante. Isso é verdade?

Afaik, move construtores posso throw, mas talvez com noexcept ainda pode ser alcançado.

Para pontos de bônus, quais garantias de segurança de rosca esta operação pode suprir?

Foi útil?

Solução

Obviamente, nem todos os tipos são habilitados para movimentos e o C ++ 0x permite lançar construtores de movimentos. Enquanto a construção do objeto a partir de um rvalue pode jogá-lo, não pode ser seguro para exceção. No entanto, o Move Semantics permite que você tenha muitos tipos que não são construíveis, dada uma fonte de RValue.

O suporte condicional para isso pode ser feito com Sfinae. Mas mesmo sem essa função de membro condicional, nada o impede de escrever:

auto stack = ...;
auto elem = std::move_if_noexcept(stack.back());
stack.pop_back();

O que é a forte garantia de exceção, mesmo caso o seu construtor de movimentos não dê a forte garantia.

Outras dicas

Quanto à pergunta bônus, isso não ofereceria segurança. Considere que, como exemplo, a maioria das implementações de std::vector Tenha três elementos de dados (ponteiro para o início da memória, ponteiro um além do final dos dados usados, ponteiro um além do final da memória alocada). Mover semântica permite que você jogada O conteúdo do vetor sem a necessidade de realocar e copiar valores, mas isso não tem nada a ver com a segurança do thread. Você teria que usar construções seguras para roscas para tornar o fio da estrutura seguro (como movendo não implica por nenhum meio atômico)

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