Pergunta

Oi eu tenho um código como este, acho que ambos sobrecarregado operador e de conversão do operador o amigo tem a função similar. No entanto, por que o amigo sobrecarregado operador é chamado neste caso? O que são as regras?

Muito obrigado!

class A{

    double i;
public:
    A(int i):i(i) {}
    operator double () const { cout<<"conversion operator"<<endl;return i;}                            // a conversion operator
    friend bool operator>(int i, A  a);                            // a friend funcion of operator >
};

bool operator>(int i, A  a ){
    cout<<"Friend"<<endl;
    return i>a.i;
}
int main()
{
    A  aa(1);
     if (0 > aa){
         return 1;
      }
}
Foi útil?

Solução

Nenhuma conversão é necessária para a operator> sobrecarregado para ser chamado. Para que o embutido operator> a ser chamado, é necessário (o operador de conversão definida pelo utilizador uma conversão. Resolução de sobrecarga prefere opções com menos conversões necessárias, de modo que o operator> sobrecarregado é usado.

Note que, se você fosse para mudar a definição de seu operator> sobrecarregado para ser, por exemplo:

friend bool operator>(double i, A  a);

você teria um erro de compilação porque tanto o operator> sobrecarregado e as built-in operator> exigiria uma conversão, e o compilador não seria capaz de resolver a ambigüidade.

Outras dicas

Eu não estou afirmando que a minha resposta é suportado pelos padrões, mas vamos pensar sobre isso logicamente.

Quando você bate esta linha:

0 > aa

Você tem duas opções. Ou você chamar o operador fornecido:

friend bool operator>(int i, A  a);

O que é 100% compatível, ou você pode fazer duas conversões para chegar ao seu destino! Qual deles você escolheria?

Se você adicionar um operador de conversão, em seguida, um objeto do tipo A pode ser convertido para o dobro quando você menos espera.

Um bom programa não fornece uma maneira para que suas aulas sejam acidentalmente usado e o operador de conversão abre a opertunity para a classe para ser usado em toda uma série de situações indesejadas (normalmente situações em que você esperaria um erro de tempo de compilação não são por causa da conversão de tipo automático).

Como uma operadores de conversão resultado (e construtores de argumentos individuais) deve ser treateed com alguns cuidados por causa de situações foram o compilador pode fazer a conversão quando você menos espera.

É chamado porque é uma correspondência exata no contexto da 0 > aa expressão. Na verdade, é difícil descobrir como você veio com a pergunta "por que". Pela lógica, one'd esperar um "porquê" questão se o amigo não foram chamado neste caso.

Se você alterar a expressão para 0.0 > aa, a chamada beciome ambígua, pois caminho neuther vai ser melhor que o outro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top