5.17 / 3
Se il secondo e il terzo operando hanno tipi diversi e uno dei due ha un tipo di classe (possibilmente qualificato in cv), si tenta di convertire ciascuno di questi operandi nel tipo dell'altro. Il processo per determinare se un'espressione di operando E1 di tipo T1 può essere convertita per corrispondere a un'espressione di operando E2 di tipo T2 è definito come segue:
- Se E2 è un lvalue: E1 può essere convertito in corrispondenza di E2 se E1 può essere implicitamente convertito (clausola 4) nel tipo "riferimento a T2", fatto salvo il vincolo che nella conversione il riferimento deve legare direttamente (8.5.3 ) a E1.
- Se E2 è un valore, o se la conversione sopra non può essere effettuata:
- se E1 ed E2 hanno un tipo di classe e i tipi di classe sottostanti sono uguali o uno è una classe di base dell'altro: E1 può essere convertito in corrispondenza di E2 se la classe di T2 è dello stesso tipo o una classe di base di , la classe di T1 e la qualifica di cv di T2 è la stessa qualifica di cv o una qualifica di cv maggiore rispetto alla qualifica di cv di T1. Se viene applicata la conversione, E1 viene modificato in un valore di tipo T2 che fa ancora riferimento all'oggetto della classe di origine originale (o al relativo oggetto secondario appropriato). [ Nota: ovvero, non viene effettuata alcuna copia. - nota finale ] copiando l'inizializzazione di un temporaneo di tipo T2 da E1 e usando quel temporaneo come operando convertito.
Altrimenti (cioè se E1
o E2 ha un tipo non di classe, o se entrambi hanno tipi di classe ma le classi sottostanti non sono né uguali né una una classe base dell'altra): E1 può essere convertito in corrispondenza di E2 se E1 può essere implicitamente convertito nel tipo che avrebbe l'espressione E2 se E2 fosse convertito in un valore (o nel tipo che ha, se E2 è un valore).
Utilizzando questo processo, viene determinato se il secondo operando può essere convertito in modo da corrispondere al terzo operando e se il terzo operando può essere convertito in modo da corrispondere al secondo operando. Se entrambi possono essere convertiti o uno può essere convertito ma la conversione è ambigua, il programma è mal formato. Se nessuno dei due può essere convertito, gli operandi rimangono invariati e vengono eseguiti ulteriori controlli come descritto di seguito. Se è possibile esattamente una conversione, quella conversione viene applicata all'operando scelto e l'operando convertito viene usato al posto dell'operando originale per il resto di questa sezione.
5.17 / 5
Altrimenti, il risultato è un valore. Se il secondo e il terzo operando non hanno lo stesso tipo ed entrambi hanno un tipo di classe (possibilmente qualificato in cv), la risoluzione di sovraccarico viene utilizzata per determinare le conversioni (se presenti) da applicare agli operandi (13.3.1.2, 13.6) . Se la risoluzione del sovraccarico fallisce, il programma è mal formato. Altrimenti, vengono applicate le conversioni così determinate e gli operandi convertiti vengono utilizzati al posto degli operandi originali per il resto di questa sezione.