Diferencia de comportamiento al usar dynamic_cast con referencia y punteros

Estaba comprobando el comportamiento de dynamic_cast y descubrí que cuando falla, la excepción std :: bad_cast se lanza solo si el destino es un tipo de referencia. Si el destino es un tipo de puntero, no se lanzará ninguna excepción desde la conversión. Este es mi código de muestra:

class A
{
    public:
        virtual ~A()
        {
        }
};

class B : public A
{
};

int  main()
{
    A* p = new A;

    //Using reference
    try
    {
    B& b = dynamic_cast<B&>(*p);
    }
    catch(std::bad_cast exp)
    {
    std::cout<<"Caught bad cast\n";
    }

    //Using pointer
      try
    {
    B* pB = dynamic_cast<B*>(p);

    if( pB == NULL)
    {
        std::cout<<"NULL Pointer\n";
    }
    }
    catch(std::bad_cast exp)
    {
    std::cout<<"Caught bad cast\n";
    }

    return 0;
}

La salida es "Caught bad cast" y "NULL puntero". El código se compila utilizando VS2008. ¿Es este el comportamiento correcto? Si es así, entonces ¿por qué hay una diferencia?

Respuestas a la pregunta(4)

Su respuesta a la pregunta