J'y ai réfléchi récemment, et le seul argument que je peux voir pour avoir un opérateur d'égalité pour std :: unique_ptr est l'exhaustivité de sorte que tous les pointeurs intelligents de la bibliothèque de modèles standard l'ont. Mais à moins que vous n'ayez fait quelque chose de mal, je ne vois aucun exemple où cela pourrait renvoyer true.

Il est évidemment possible de faire quelque chose comme:

int* a = new int(1);
std::unique_ptr<int> u_a1(a);
std::unique_ptr<int> u_a2(a);

if(u_a1 == u_a2)
{
    std::cout << "I'm double deleting soon" << std::endl;
}

Mais l'inclusion de l'opérateur ne permet-elle pas simplement aux gens de faire ce genre d'erreurs sans que le compilateur lève une erreur? Ne serait-il pas plus logique de le supprimer ou est-ce que je manque quelque chose?

5
FlamFace 3 avril 2020 à 00:20

3 réponses

Meilleure réponse

L'égalité peut en fait retourner vrai. Le cas le plus simple est constitué de deux pointeurs vides:

std::unique_ptr u_a1;
std::unique_ptr u_a2;

if (u_a1 == u_a2) // ...

Les opérateurs permettent également de comparer des objets unique_ptr<T, D> avec différents types, vous pouvez donc avoir deux types de déléteurs différents qui feront des choses différentes sur le même pointeur lors du nettoyage. Ou même un suppresseur autre que le suppresseur par défaut qui peut intentionnellement faire la même chose plus d'une fois (un compteur?).

La présence des opérateurs peut également rendre le type valide dans certains modèles qui souhaiteraient comparer des objets de ses types dépendants.

8
aschepler 2 avril 2020 à 21:29

Vous pouvez l'utiliser pour vérifier si un unique_ptr est nul, et vous pouvez également avoir des références à unique_ptr afin que vous puissiez l'utiliser pour voir si elles font référence au même unique_ptr.

1
Ian4264 2 avril 2020 à 21:28

Les pointeurs intelligents sont censés avoir la même sémantique que les pointeurs bruts, avec juste une sémantique de propriété automatisée ajoutée. Étant donné que les pointeurs bruts peuvent être comparés, leurs homologues de pointeurs intelligents le peuvent également. La question de savoir s'il est logique ou non de comparer 2 unique_ptr s est une question distincte.

2
Remy Lebeau 2 avril 2020 à 22:02