Conversiones implícitas
Las conversiones implícitas se realizan cada vez que una expresión de algún tipo T1 se utiliza en un contexto que no acepta ese tipo, pero acepta algún otro tipo T2; en particular:
- cuando la expresión se utiliza como el argumento al llamar a una función que se declara con
T2como parámetro; - cuando la expresión se utiliza como un operando con un operador que espera
T2; - cuando se inicializa un nuevo objeto de tipo
T2, incluyendo la instrucciónreturnen una función que devuelveT2; - cuando se usa la expresión en una instrucción
switch(T2es de tipo entero); - cuando se usa la expresión en una instrucción
ifo un bucle (T2es de tipobool).
El programa está bien formado (se compila) sólo si existe una secuencia de conversión implícita inequívoca de T1 a T2.
Si hay varias sobrecargas de la función o el operador que se llama, después que la secuencia de conversión implícita se construye a partir de T1 para cada T2 disponible, las reglas de resolución de sobrecarga deciden cuál sobrecarga se compila.
Nota: En expresiones aritméticas, el tipo de destino de las conversiones implícitas en los operandos dados a los operadores binarios se determina por un conjunto de reglas separado: conversiones aritméticas habituales.
Orden de las conversiones
La secuencia de la conversión implícita consiste en lo siguiente, en este orden:
Al considerar el argumento de un constructor o de una función de conversión definida por el usuario, se permite solamente una secuencia de conversión estándar (de lo contrario, las conversiones definidas por el usuario podrían estar efectivamente encadenadas). Al convertir de un tipo no-clase a otro tipo no-clase, se permite solamente una secuencia de conversión estándar.
Una secuencia de conversión estándar consiste en lo siguiente, en este orden:
- conversión l-valor a r-valor,
- conversión de array a puntero, y
- conversión puntero a función;
|
3) cero o una conversión puntero a función;
|
(desde C++17) |
Una conversión definida por el usuario consiste de cero o un constructor de conversión no explícito, de un solo argumento, o de una llamada a función de conversión no explícita.
Se dice que una expresión e es implícitamente convertible a T2 si y sólo si la declaración T2 puede ser inicializada por copia de e, es decir, la declaración T2 t = e; está bien formada (puede compilarse) para algún objeto temporal arbitrario t. Observa que esto es diferente de la inicialización directa (T2 t(e)), donde se considerarían adicionalmente los constructores explícitos y las funciones de conversión.
Conversiones contextuales
|
En los siguientes contextos, se espera el tipo
|
(desde C++11) |
En los siguientes contextos, se espera un tipo T específico del contexto, y la expresión e de tipo clase E solamente se permite si
|
(hasta C++14) |
|