Resolução de ambiguidade
Para executar conversões explícitas de um tipo em outro, você deve usar as conversões, especificando o nome do tipo desejado. Algumas conversões de tipos resultam na ambiguidade sintática. A seguinte conversão de tipos estilo função é ambígua:
char *aName( String( s ) );
Não está claro se esta é uma declaração de função ou uma declaração de objeto com conversão estilo função do inicializador: poderia declarar um tipo de retorno char * que usa um argumento de tipo String ou poderia declarar o objeto aName e inicializá-lo com o valor de s convertido no tipo String.
Se uma declaração puder ser considerada uma declaração de função válida, ela será tratada como tal. Se, possivelmente, ela não for uma declaração de função – ou seja, se estiver sintaticamente incorreta — será uma instrução examinada para ver se é uma conversão de tipo estilo função. Portanto, o compilador considera a instrução como uma declaração de uma função e ignora os parênteses em torno do identificador s. Por outro lado, as instruções:
char *aName( (String)s );
e
char *aName = String( s );
são claramente declarações de objetos, e uma conversão definida pelo usuário do tipo String no tipo char * é chamada para executar a inicialização de aName.