Dans une réponse à Is it safe to store objects of a class which has an std::auto_ptr as its member variable in std::vector?, j'ai déclaré qu'une classe contenant un auto_ptr pouvait être stockée dans un vecteur à condition que la classe comprenait un constructeur de copie défini par l'utilisateur.Classe contenant auto_ptr stockée dans le vecteur
Il y avait plusieurs commentaires suggérant que ce n'était pas le cas, donc cette question est une tentative pour résoudre le problème. Considérez le code suivant:
#include <memory>
#include <vector>
using namespace std;
struct Z {};
struct A {
A(Z z)
: p(new Z(z)) {}
A(const A & a)
: p(a.p.get() ? new Z(*a.p.get()) : 0) {}
// no assigment op or dtor defined by intent
auto_ptr <Z> p;
};
int main() {
vector <A> av;
Z z;
A a(z);
av.push_back(a);
av.push_back(A(z));
av.clear();
}
S'il vous plaît examiner la & ci-dessus dans votre réponse indiquer où le comportement non défini au sens de la norme C++ pourrait se produire pour cette classe particulière utilisée de cette manière particulière. Je ne suis pas intéressé si la classe est utile, sage, triable, ou comment il fonctionne sous des exceptions.
S'il vous plaît noter également que ce n'est pas une question sur la validité de la création d'un vecteur de auto_ptrs - Je suis bien conscient des problèmes à ce sujet.
Merci à tous pour vos entrées sur ce que dans rétrospectivement est probablement une question stupide. plutôt Je suppose que je me suis concentré trop sur la copie ctor & oublié affectation. Le gagnant de mes points d'acceptation (et les points signifient prix!) Est litb pour une généralement explication exhaustive (désolé Earwicker)
Est-ce une question du 1er avril? AFAIK, vous êtes plus capable, que la plupart d'entre nous de comprendre UB :-) – dirkgently
Je savais que quelqu'un demanderait ceci :-) Mais non, je suis sérieux. –