Maison >développement back-end >C++ >Pourquoi un opérateur de « vaisseau spatial » personnalisé ne génère-t-il pas les opérateurs `==` et `!=` dans C 20 ?

Pourquoi un opérateur de « vaisseau spatial » personnalisé ne génère-t-il pas les opérateurs `==` et `!=` dans C 20 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-07 05:35:02376parcourir

Why Doesn't a Custom `spaceship` Operator Generate `==` and `!=` Operators in C  20?

Non par défaut <=> Opérateur et absence de == et !=

Dans C 20, le nouvel opérateur de vaisseau spatial (<=>) a provoqué un comportement inattendu concernant la génération des opérateurs == et != . Les utilisateurs peuvent rencontrer des erreurs de compilation lorsqu'ils utilisent un opérateur de vaisseau spatial autre que celui par défaut avec des implémentations personnalisées.

Par défaut, l'opérateur de vaisseau spatial compare deux objets d'un type donné. Si une classe ne définit pas explicitement un opérateur == mais définit un opérateur de vaisseau spatial par défaut, le compilateur générera automatiquement un opérateur == avec le même accès que l'opérateur de vaisseau spatial. Ce comportement, spécifié dans le standard de langage [class.compare.default], garantit que les classes comme std::vector n'utilisent pas d'opérateurs de vaisseau spatial non par défaut pour les tests d'égalité.

Cependant, si l'opérateur de vaisseau spatial n'est pas par défaut (c'est-à-dire qu'il a une implémentation personnalisée), le compilateur ne générera pas d'opérateur ==. En effet, les classes qui définissent des opérateurs de vaisseau spatial personnalisés peuvent nécessiter des implémentations spécialisées pour == afin de gérer des scénarios de comparaison spécifiques. Ainsi, le langage laisse au programmeur le soin de définir explicitement l'opérateur == si nécessaire.

Par exemple, considérons le code suivant :

#include <compare>

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&) const = default; // Default implementation
};

Ce code se compile avec succès car le vaisseau spatial L'opérateur est par défaut et le compilateur génère l'opérateur ==. Cependant, si nous changeons l'opérateur du vaisseau spatial en une implémentation personnalisée :

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&amp; other) const
    {
        return Dummy <=> other.Dummy;
    }
};

La compilation du code échouera désormais, avec une erreur indiquant que l'opérateur == n'est pas défini pour la classe X. En effet, le L'opérateur de vaisseau spatial modifié n'est pas par défaut et le compilateur ne génère pas automatiquement d'opérateur ==. Dans ce cas, l'utilisateur devra définir explicitement l'opérateur == pour répondre aux besoins de comparaison de sa classe personnalisée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn