Conversión definida por el usuario
Permite una conversión implícita o una conversión explícita de un tipo clase a otro tipo.
Sintaxis
La función de conversión se declara como una función miembro no estática o plantilla de función miembro sin parámetros, un tipo de retorno no explícito y con el nombre en el formato:
operator id-de-tipo-de-la-conversión
|
(1) | ||||||||
explicit operator id-de-tipo-de-la-conversión
|
(2) | (desde C++11) | |||||||
explicit ( expresión ) operator id-de-tipo-de-la-conversión
|
(3) | (desde C++20) | |||||||
id-de-tipo-de-la-conversión es un id de tipo excepto que los operadores de función y array () o [] no se permiten en su declarador (por lo tanto, conversiones a tipos como puntero a array requieren un alias de tipo/typedef o una plantilla de identidad: véase más abajo). Independientemente de typedef, id-de-tipo-de-la-conversión no puede representar un array o un tipo de función.
Aunque no se permite el tipo de retorno en la declaración de una función de conversión definida por el usuario, la sec-decl-especificadores de la gramática de declaración puede estar presente y puede incluir cualquier especificador excepto el especificador-de-tipo o la palabra clave static. Además de explicit, también se permiten los especificadores inline, virtual, constexpr (desde C++11), consteval (desde C++20), y friend (observa que friend requiere un nombre calificado: friend A::operator B();).
Cuando tal función miembro se declara en la clase X, realiza la conversión de X al id-de-tipo-de-la-conversión:
struct X {
// conversión implícita
operator int() const { return 7; }
// conversión explícita
explicit operator int*() const { return nullptr; }
// ERROR: operador array no se permite en el id-de-tipo-de-la-conversión
// operator int(*)[3]() const { return nullptr; }
using arr_t = int[3];
operator arr_t*() const { return nullptr; } // de acuerdo si se hace mediante typedef
// operator arr_t () const; // ERROR: no se permite conversión a array en ningún caso
};
int main()
{
X x;
int n = static_cast<int>(x); // de acuerdo: establece n a 7
int m = x; // de acuerdo: establece m a 7
int* p = static_cast<int*>(