ambiguidade de sobrecarga do operador de conversão, compiladores diferem

Eu já vi outras perguntas sobre SO sobre isso, mas nenhuma que explique isso na íntegra. O que écerto maneiras de os compiladores lidarem com as duas situações abaixo? Eu tentei com gcc 4.7.1 (com -std = c ++ 0x), VS2010 e VS2012 obter resultados diferentes em todos:

Exemplo 1:

struct BB
{
 // generic cast
 template<typename T>
 operator T() const
 {   
   return 0;
 }

 // string cast
 operator std::string() const
 { 
   return string("hello");
 }
};

int main()
{
  BB b;
  string s = b;
}

Saída:

gcc 4.7.1: OkVS2010: OkVS2012: Falha: "Não é possível converter de BB para string"

Exemplo 2:

struct BB
{
 // generic cast
 template<typename T>
 operator T() const
 {   
   return 0;
 }

 // string cast
 operator std::string() const
 { 
   return string("hello");
 }
};

int main()
{
  BB b;
  string s = (string)b;

Saída:

gcc 4.7.1: Falha: a chamada de string sobrecarregada (BB &) é ambíguaVS2010: OkVS2012: Falha: "Não é possível converter de BB para string"

questionAnswers(2)

yourAnswerToTheQuestion