Notice: Unexpected clearActionName after getActionName already called in /var/www/cppreference.com/public/includes/context/RequestContext.php on line 338
Conversiones implícitas - cppreference.com
Espacios de nombres
Variantes

Conversiones implícitas

De cppreference.com
(Redirigido desde «cpp/language/implicit cast»)
 
 
 
 

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 T2 como 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ón return en una función que devuelve T2;
  • cuando se usa la expresión en una instrucción switch (T2 es de tipo entero);
  • cuando se usa la expresión en una instrucción if o un bucle (T2 es de tipo bool).

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:

1) cero o una secuencia de conversión estándar;
2) cero o una conversión definida por el usuario;
3) cero o una secuencia de conversión estándar (solo si se usa una conversión definida por el usuario).

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:

1) cero o una conversión del siguiente conjunto:
  • conversión l-valor a r-valor,
  • conversión de array a puntero, y
  • conversión puntero a función;
2) cero o una promoción numérica o conversión numérica;
3) cero o una conversión puntero a función;
(desde C++17)
4) cero o una conversión de calificación.

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 bool t la conversión implícita se realiza si la declaración bool t(e); está bien formada (es decir, una función de conversión explícita tal como explicit T::operator bool() const; se considera). Tal expresión e se dice que es contextualmente convertida a bool:

  • la expresión de control de if, while, for;
  • los operandos de los operadores lógicos integrados !, && y ||;
  • el primer operando del operador condicional ?:;
  • el predicado en una declaración de aserción estática, static_assert;
  • la expresión en un especificador noexcept;
  • la expresión en un especificador explicit.
(desde C++20)
(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)
  • hay exactamente un tipo