Compilateurs C++ générer automatiquement copier les constructeurs et la copie des opérateurs d'affectation. Pourquoi ne pas swap
trop?
Ces jours-ci la méthode préférée pour la mise en œuvre de la copie-opérateur d'affectation est la copie-et-swap idiome:
T& operator=(const T& other)
{
T copy(other);
swap(copy);
return *this;
}
(en ignorant le copier-élision-forme conviviale qui utilise le passage par valeur).
Ce langage a l'avantage d'être transactionnelle dans le visage des exceptions (en supposant que l' swap
mise en œuvre n'a pas les jeter). En revanche, la valeur par défaut généré par le compilateur copier-opérateur d'affectation de manière récursive ne copie-affectation sur toutes les classes de base et des données des membres, et qui n'ont pas la même exception de garanties de sécurité.
Pendant ce temps, la mise en œuvre de swap
méthodes à la main est fastidieux et source d'erreurs:
- Pour s'assurer que
swap
ne les jetez pas, il doit être mis en œuvre pour tous les non-POD membres dans la classe et dans les classes de base, dans leur non-POD membres, etc. - Si un responsable ajoute un nouveau membre de données à une classe, le responsable doit veiller à modifier cette classe
swap
méthode. À défaut de le faire peut introduire des bogues subtils. Aussi, depuisswap
est une méthode ordinaire, les compilateurs (au moins aucun que je connais) n'émettent pas de mises en garde si l'swap
mise en œuvre est incomplète.
Ne serait-il pas mieux si le compilateur a généré swap
méthodes automatiquement? Ensuite, l'implicite de copie d'attribution de la mise en œuvre pourrait en tirer profit.
La réponse évidente est probablement: la copie-et-swap idiome n'existait pas quand C++ a été développé, et à faire maintenant pourrait casser le code existant.
Encore, peut-être que les gens pourraient choisir de laisser le compilateur de générer swap
en utilisant la même syntaxe que le C++0x utilise pour contrôler d'autres fonctions implicites:
void swap() = default;
et puis il pourrait y avoir des règles:
- Si il est généré par le compilateur
swap
méthode implicite de copier-opérateur d'affectation peuvent être mises en œuvre à l'aide de la copie et de l'échange. - Si il n'est pas généré par le compilateur
swap
méthode implicite de copier-opérateur d'affectation serait mis en œuvre comme avant (en invoquant copier-transfert sur toutes les classes de base et de tous les membres).
Personne ne sait si cette (folle?) les choses ont été suggérées pour le C++ comité des normes, et, dans l'affirmative, quelles sont les opinions des membres du comité avaient?