niejednoznaczność przeładowania operatora konwersji, kompilatory różnią się

Widziałem inne pytania dotyczące SO w tej sprawie, ale żadna nie wyjaśnia tego w pełni. Co to jestdobrze sposoby dla kompilatorów na radzenie sobie z dwiema sytuacjami poniżej? Próbowałem go z gcc 4.7.1 (z -std = c ++ 0x), VS2010 i VS2012, uzyskując różne wyniki na wszystkich:

Przykład 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;
}

Wydajność:

gcc 4.7.1: OkVS2010: OkVS2012: Niepowodzenie: „Nie można przekonwertować z BB na ciąg”

Przykład 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;

Wydajność:

gcc 4.7.1: Niepowodzenie: wywołanie przeciążonego ciągu (BB i) jest nietypoweVS2010: OkVS2012: Niepowodzenie: „Nie można przekonwertować z BB na ciąg”