Bloqueo de capturas y conversión de tipos en C++

Prediga la salida del siguiente programa C++.

C++

#include <iostream>
using namespace std;
 
int main()
{
    try
    {
        throw 'x';
    }
    catch(int x)
    {
        cout << " Caught int " << x;
    }
    catch(...)
    {
        cout << "Default catch block";
    }
}

Producción:

 Default catch block

En el programa anterior, se lanza un carácter ‘x’ y hay un bloque catch para capturar un int. Uno podría pensar que el bloque catch int podría coincidir considerando el valor ASCII de ‘x’. Pero tales conversiones no se realizan para bloques catch. Considere el siguiente programa como otro ejemplo en el que no se llama al constructor de conversión para el objeto lanzado.

C++

#include <iostream>
using namespace std;
 
class MyExcept1 {};
 
class MyExcept2
{
public:
 
    // Conversion constructor
    MyExcept2 (const MyExcept1 &e )
    {
        cout << "Conversion constructor called";
    }
};
 
int main()
{
    try
    {
        MyExcept1 myexp1;
        throw myexp1;
    }
    catch(MyExcept2 e2)
    {
        cout << "Caught MyExcept2 " << endl;
    }
    catch(...)
    {
        cout << " Default catch block " << endl;
    }
    return 0;
}

Producción:

Default catch block

Como nota al margen, los objetos de tipo derivado se convierten en tipo base cuando se lanza un objeto derivado y hay un bloque catch para capturar el tipo base. Consulte este GFact para obtener más detalles.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *