Pergunta

Qual é a lógica da pesquisa de Koenig?

Não consigo evitar pensar nisso como algo que torna seu código muito mais difícil de ler e mais instável.

Eles não poderiam definir a pesquisa do Koenig para que ele funcione apenas para casos específicos (ou seja: operadores não membros) ou quando explicitamente exigidos?

Foi útil?

Solução

A motivação original, IIRC, era poder escrever

std::cout << 42;

sem ter que se qualificar std::operator<<(std::ostream&, int) explicitamente.

Se você deseja desativar a pesquisa dependente do argumento, pode qualificar explicitamente o nome da função, ou seja. usar std::swap ao invés de swap prevenir swap Ser analisado em qualquer espaço para nome de seus argumentos viveria.

O ADL também pode ser usado com o SFINAE para testar no momento da compilação se alguma função é definida para um tipo específico (vou deixar você resolver isso como um exercício, há pelo menos uma pergunta sobre isso no StackOverflow).

Outras dicas

O caso de uso mais forte para ADL é para casos como este.

namespace A
{
    struct S {};
    S operator+( const S&, const S& );
}

namespace B
{
    A::S test()
    {
        A::S a, b;
        return a + b;
    }
}

Também é útil para selecionar o correto swap função no código genérico, para que não se aplique apenas a operator funções. Já é uma parte bastante complexa do padrão, fazendo regras que o impediram de trabalhar em alguns casos acrescentaria mais complexidade, qual seria o ganho?

Não consigo pensar em nenhuma maneira interessante de pedir explicitamente que seria significativamente menor do que chamar uma função em um espaço de nome diferente diretamente e, em qualquer caso, tornaria expressões mais complexas.

Você estamos pensando em algo como: return [[ use_adl ]] (a + b); vs. return A::operator+( a, b ); ?

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