5.17 / 3
Wenn der zweite und der dritte Operand unterschiedliche Typen haben und entweder einen (möglicherweise cv-qualifizierten) Klassentyp haben, wird versucht, jeden dieser Operanden in den Typ des anderen zu konvertieren. Der Prozess zum Bestimmen, ob ein Operandenausdruck E1 vom Typ T1 konvertiert werden kann, um mit einem Operandenausdruck E2 vom Typ T2 übereinzustimmen, ist wie folgt definiert:
- Wenn E2 ein l-Wert ist: E1 kann konvertiert werden, um mit E2 übereinzustimmen, wenn E1 implizit in den Typ „Referenz auf T2“ konvertiert werden kann (Abschnitt 4), unter der Bedingung, dass die Referenz bei der Konvertierung direkt gebunden werden muss (8.5.3 ) bis E1.
- Wenn E2 ein r-Wert ist oder wenn die obige Konvertierung nicht möglich ist:
- Wenn E1 und E2 einen Klassentyp haben und die zugrunde liegenden Klassentypen gleich sind oder einer eine Basisklasse des anderen ist: E1 kann in E2 konvertiert werden, wenn die Klasse von T2 der gleiche Typ wie oder eine Basisklasse von ist , die Klasse von T1 und die Lebenslaufqualifikation von T2 ist dieselbe Lebenslaufqualifikation wie oder eine höhere Lebenslaufqualifikation als die Lebenslaufqualifikation von T1. Wenn die Konvertierung angewendet wird, wird E1 in einen Wert vom Typ T2 geändert, der sich immer noch auf das ursprüngliche Quellklassenobjekt (oder das entsprechende Unterobjekt davon) bezieht. [ Hinweis: Das heißt, es wird keine Kopie erstellt. - Endnote ] durch Kopieren und Initialisieren eines Temporärs vom Typ T2 aus E1 und Verwenden dieses Temporärs als konvertierten Operanden.
Andernfalls (dh wenn E1
oder E2 einen Nichtklassentyp hat oder wenn beide Klassentypen haben, die zugrunde liegenden Klassen jedoch entweder nicht gleich oder eine Basisklasse der anderen sind): E1 kann in E2 konvertiert werden, wenn E1 sein kann implizit in den Typ konvertiert, den der Ausdruck E2 haben würde, wenn E2 in einen r-Wert konvertiert würde (oder in den Typ, den er hat, wenn E2 ein r-Wert ist).
Mit diesem Verfahren wird bestimmt, ob der zweite Operand konvertiert werden kann, um mit dem dritten Operanden übereinzustimmen, und ob der dritte Operand konvertiert werden kann, um mit dem zweiten Operanden übereinzustimmen. Wenn beide konvertiert werden können oder einer konvertiert werden kann, die Konvertierung jedoch nicht eindeutig ist, ist das Programm fehlerhaft. Wenn keiner konvertiert werden kann, bleiben die Operanden unverändert und die weitere Überprüfung wird wie unten beschrieben durchgeführt. Wenn genau eine Konvertierung möglich ist, wird diese Konvertierung auf den ausgewählten Operanden angewendet und der konvertierte Operand wird für den Rest dieses Abschnitts anstelle des ursprünglichen Operanden verwendet.
5.17 / 5
Andernfalls ist das Ergebnis ein Wert. Wenn der zweite und der dritte Operand nicht denselben Typ haben und entweder einen (möglicherweise lebenslaufqualifizierten) Klassentyp haben, wird die Überlastungsauflösung verwendet, um die Konvertierungen (falls vorhanden) zu bestimmen, die auf die Operanden angewendet werden sollen (13.3.1.2, 13.6). . Wenn die Überlastungsauflösung fehlschlägt, ist das Programm fehlerhaft. Andernfalls werden die so ermittelten Konvertierungen angewendet und die konvertierten Operanden werden für den Rest dieses Abschnitts anstelle der ursprünglichen Operanden verwendet.