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
Libérer: 2024-11-07 05:35:02
original
385 Les gens l'ont consulté

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
};
Copier après la connexion

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;
    }
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal