Espacios de nombres
Variantes

Conversión definida por el usuario

De cppreference.com
 
 
 
 

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)
1) Declara una función de conversión definida por el usuario que participa en todas las conversiones implícitas y explícitas.
2) Declara una función de conversión definida por el usuario que participa solamente en la inicialización directa y las conversiones explícitas.
3) Declara una función de conversión definida por el usuario que es condicionalmente explícita.

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*>(