Nicht standardmäßig <=> Operator und das Fehlen von == und !=
In C 20 hat der neu eingeführte Raumschiff-Operator (<=>) zu unerwartetem Verhalten bei der Generierung von ==- und !=-Operatoren geführt . Benutzer können auf Kompilierungsfehler stoßen, wenn sie einen nicht standardmäßigen Raumschiff-Operator mit benutzerdefinierten Implementierungen verwenden.
Standardmäßig vergleicht der Raumschiff-Operator zwei Objekte eines bestimmten Typs. Wenn eine Klasse nicht explizit einen ==-Operator, aber einen standardmäßigen, nicht standardmäßigen Raumschiffoperator definiert, generiert der Compiler automatisch einen ==-Operator mit demselben Zugriff wie der Raumschiffoperator. Dieses im Sprachstandard [class.compare.default] spezifizierte Verhalten stellt sicher, dass Klassen wie std::vector keine nicht standardmäßigen Raumschiffoperatoren für Gleichheitstests verwenden.
Allerdings, wenn der Raumschiffoperator dies nicht ist Standardmäßig (d. h. es verfügt über eine benutzerdefinierte Implementierung) generiert der Compiler keinen ==-Operator. Dies liegt daran, dass Klassen, die benutzerdefinierte Raumschiffoperatoren definieren, möglicherweise spezielle Implementierungen für == erfordern, um bestimmte Vergleichsszenarien zu verarbeiten. Somit überlässt es die Sprache dem Programmierer, den ==-Operator bei Bedarf explizit zu definieren.
Betrachten Sie beispielsweise den folgenden Code:
#include <compare> struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
Dieser Code wird aufgrund des Raumschiffs erfolgreich kompiliert Der Operator ist standardmäßig voreingestellt und der Compiler generiert den ==-Operator. Wenn wir jedoch den Raumschiff-Operator in eine benutzerdefinierte Implementierung ändern:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
Der Code kann jetzt nicht kompiliert werden, und es wird ein Fehler angezeigt, der darauf hinweist, dass der ==-Operator nicht für Klasse X definiert ist. Dies liegt daran, dass der Der modifizierte Raumschiff-Operator ist nicht standardmäßig voreingestellt und der Compiler generiert nicht automatisch einen ==-Operator. In diesem Fall müsste der Benutzer den ==-Operator explizit definieren, um den Vergleichsanforderungen seiner benutzerdefinierten Klasse gerecht zu werden.
Das obige ist der detaillierte Inhalt vonWarum generiert ein benutzerdefinierter „Raumschiff'-Operator in C 20 keine „=='- und „!='-Operatoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!