5.17 / 3
Si el segundo y el tercer operando tienen tipos diferentes, y cualquiera de ellos tiene un tipo de clase (posiblemente calificado para cv), se intenta convertir cada uno de esos operandos al tipo del otro. El proceso para determinar si una expresión de operando E1 de tipo T1 se puede convertir para que coincida con una expresión de operando E2 de tipo T2 se define de la siguiente manera:
- Si E2 es un valor l: E1 se puede convertir para que coincida con E2 si E1 se puede convertir implícitamente (cláusula 4) al tipo “referencia a T2”, sujeto a la restricción de que en la conversión la referencia debe unirse directamente (8.5.3 ) a E1.
- Si E2 es un valor r, o si la conversión anterior no se puede hacer:
- si E1 y E2 tienen un tipo de clase, y los tipos de clase subyacentes son iguales o uno es una clase base del otro: E1 se puede convertir para que coincida con E2 si la clase de T2 es del mismo tipo o una clase base de , la clase de T1 y la calificación cv de T2 es la misma calificación cv o una calificación cv mayor que la calificación cv de T1. Si se aplica la conversión, E1 se cambia a un valor de tipo T2 que todavía se refiere al objeto de la clase fuente original (o al subobjeto apropiado del mismo). [ Nota: es decir, no se realiza ninguna copia. - nota final ] copia-inicializando un temporal de tipo T2 de E1 y usando ese temporal como el operando convertido.
De lo contrario (es decir, si E1
o E2 tiene un tipo que no es de clase, o si ambos tienen tipos de clase pero las clases subyacentes no son las mismas o una clase base de la otra): E1 se puede convertir para que coincida con E2 si E1 puede ser se convirtió implícitamente al tipo que tendría la expresión E2 si E2 se convirtiera a un valor r (o el tipo que tiene, si E2 es un valor r).
Usando este proceso, se determina si el segundo operando se puede convertir para que coincida con el tercer operando, y si el tercer operando se puede convertir para que coincida con el segundo operando. Si ambos se pueden convertir, o uno se puede convertir pero la conversión es ambigua, el programa está mal formado. Si ninguno de los dos se puede convertir, los operandos no se modifican y se realiza una verificación adicional como se describe a continuación. Si es posible exactamente una conversión, esa conversión se aplica al operando elegido y el operando convertido se usa en lugar del operando original para el resto de esta sección.
5.17 / 5
De lo contrario, el resultado es un valor r. Si el segundo y el tercer operandos no tienen el mismo tipo, y alguno de ellos tiene (posiblemente calificado por cv), la resolución de sobrecarga se usa para determinar las conversiones (si las hay) que se aplicarán a los operandos (13.3.1.2, 13.6) . Si la resolución de sobrecarga falla, el programa está mal formado. De lo contrario, se aplican las conversiones así determinadas, y los operandos convertidos se usan en lugar de los operandos originales para el resto de esta sección.