Diferença no comportamento ao usar dynamic_cast com referência e ponteiros

Eu estava verificando o comportamento do dynamic_cast e descobri que quando ele falha, a exceção std :: bad_cast é lançada somente se o destino for um tipo de referência. Se o destino for um tipo de ponteiro, nenhuma exceção será lançada do lançamento. Este é o meu código de amostra:

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;
}

A saída é "Captura incorreta" e "Ponteiro NULO". Código é compilado usando o VS2008. Esse é o comportamento correto? Se sim, então porque há uma diferença?

questionAnswers(4)

yourAnswerToTheQuestion