Pegue este código:
struct Foo {
operator char() {
return '1';
}
operator std::string() {
return "0";
}
};
int main() {
std::string name;
Foo foo;
name = Foo(); //error: '=' is ambiguous
}
Acho que a atribuição é ambígua porque std::string
tem um operador de atribuição tomando char
. É possível fazer Foo
atribuições para std::string
preferir std::string's
a execução do construtor de cópias std::string
? Você também poderia fazer a mesma coisa com outros tipos quando essas ambigüidades ocorrerem?
Não, você precisaria especificar o tipo explicitamente:
No entanto,
std::string
possui umaassign
função membro com efeito equivalente a=
, mas sem a sobrecarga problemática:Em geral você precisa ser explícito sobre o tipo que deseja, como mostro acima. Em determinados cenários, pode haver outras soluções alternativas mais simples.
Além disso, todos esses problemas aparecem apenas porque as funções de conversão não são
explicit
. Considere se é realmente razoável ter conversões implícitas parachar
estd::string
. Múltiplas funções de conversão, especialmente implícitas, também podem facilmente causar outros problemas de resolução de sobrecarga. Geralmente, ser explícito sobre as conversões é a abordagem mais segura.