Est-ce qu'une pile a une exception méthode sûre pour le retour et le retrait de l'élément supérieur avec la sémantique de mouvement?

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

Question

Dans une réponse à une question sur std::stack::pop() je prétendais que la pop raison ne retourne pas la valeur est pour des raisons de sécurité d'exception (ce qui se passe si le constructeur de copie lance).

@Konrad a fait remarquer que maintenant avec la sémantique de déplacer ce n'est plus pertinent. Est-ce vrai?

AFAIK, déplacer les constructeurs peut throw , mais peut-être avec noexcept il peut encore être atteint.

Pour les points de bonus quelles garanties la sécurité fil peut cette alimentation de fonctionnement?

Était-ce utile?

La solution

Bien sûr, chaque type est mouvement activé et C ++ 0x permet même de lancer des constructeurs de mouvement. Tant que la construction de l'objet à partir d'un rvalue peut jeter ne peut pas être exception de sécurité. Cependant, la sémantique de déplacement vous permet d'avoir de nombreux types qui sont nothrow-donné une source constructible rvalue.

un appui conditionnel à ce qui pourrait être fait avec SFINAE. Mais même sans une telle rien fonction membre conditionnel vous empêche d'écrire:

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

qui est fait la garantie forte d'exception, même dans le cas où votre constructeur de déplacement ne donne pas la garantie forte.

Autres conseils

En ce qui concerne la question de bonus, qui offrirait sans fil sécurité. Considérons que, à titre d'exemple, la plupart des mises en œuvre de std::vector ont trois éléments de données (pointeur au début de la mémoire, un pointeur au-delà de la fin des données utilisés, l'un pointeur au-delà de la fin de la mémoire allouée). sémantique Déplacer vous permettent de move le contenu du vecteur sans la nécessité de réaffecter et de copier des valeurs, mais cela n'a rien à voir avec la sécurité des threads. Vous devez utiliser des constructions thread-safe pour rendre le coffre-fort de fil de structure (comme déplacer ne signifie pas par quelque moyen que atomique )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top