Conversión es cuando un valor es , um, convertido a un tipo diferente. El resultado es un valor del tipo de destino, y hay reglas para qué resultado de valor de salida de qué entrada (del tipo de fuente).
Por ejemplo:
int i = 3;
unsigned int j;
j = i; // the value of "i" is converted to "unsigned int".
El resultado es el valor unsigned int
que es igual al módulo i
UINT_MAX+1
, y esta regla es parte del lenguaje. Entonces, en este caso, el valor (en inglés) sigue siendo "3", pero es un valor int sin signo de 3, que es sutilmente diferente de un valor int firmado de 3.
Tenga en cuenta que la conversión se realizó automáticamente, solo usamos un valor int firmado en una posición donde se requiere un valor int sin firmar, y el lenguaje define lo que eso significa sin que realmente digamos que estamos convirtiendo. Eso se llama una "conversión implícita".
"Casting" es una conversión explícita.
Por ejemplo:
unsigned int k = (unsigned int)i;
long l = long(i);
unsigned int m = static_cast<unsigned int>(i);
son todos los moldes. Específicamente, de acuerdo con 5.4/2 de la norma, k
usa una expresión de conversión , y de acuerdo con 5.2.3/1, l
usa una cosa equivalente (excepto que he usado un tipo diferente). m
utiliza un "operador de conversión de tipo" (static_cast
), pero otras partes de la norma se refieren a esos como "moldes" también.
tipos definidos por el usuario pueden definir "funciones de conversión" que proporcionan normas específicas para la conversión de su tipo a otro tipo, y constructores sola-ARG se utilizan en las conversiones también:
struct Foo {
int a;
Foo(int b) : a(b) {} // single-arg constructor
Foo(int b, int c) : a(b+c) {} // two-arg constructor
operator float() { return float(a); } // conversion function
};
Foo f(3,4); // two-arg constructor
f = static_cast<Foo>(4); // conversion: single-arg constructor is called
float g = f; // conversion: conversion function is called
+1, pero debe tenerse en cuenta que esta terminología no se cumple estrictamente. Considera 'int i; float f = static_cast (i) '- según su lógica (y estoy de acuerdo), esta es una * conversión *, no un reparto. C++ todavía usa 'static_cast' (y sí, soy consciente de que una conversión implícita funcionaría aquí). En otras palabras: has dado la distinción semánticamente más significativa de los dos términos. Pero C++ no sigue esta distinción. –
Editado para aclarar algunas cosas, con suerte no estoy difundiendo información errónea. –
Pareces estar diciendo que una * expresión-molde * (5.4/2) no es un elenco, sino una conversión. Esta puede ser una definición útil de "conversión" frente a "conversión" para lenguajes de programación en general, pero no es la definición de "conversión" utilizada en el estándar de C++. –