ADL в сравнении с областью разрешения - что предпочитать? - PullRequest
0 голосов
/ 12 февраля 2012

Как мне узнать, следует ли мне использовать

my_type bar;
using some_namespace::foo;
foo(bar);

вместо

some_namespace::foo(bar);

при вызове моей функции foo (что не входит в мои непосредственные рамки)?Существует ли общее «правило» для выяснения, следует ли использовать ADL или нет?Какой из них я должен использовать "по умолчанию"?

1 Ответ

1 голос
/ 12 февраля 2012

Это не ADL.В обоих ваших примерах foo найдено с помощью обычного поиска.Пример использования ADL может быть следующим:

namespace ns {
    class A { };
    void f(A) { };
}

int main() {
    f(A());
}

Здесь f не найден при обычном поиске, но он найден через поиск, зависящий от аргумента (потому что он находится в пространстве имен ns рядом с A).В любом случае ...

Избегайте ADL, где это возможно.

ADL полезен в определенных конкретных сценариях, например, для перегрузки оператора и для концепции смены.Тем не менее, его следует использовать с осторожностью, поскольку это приводит к странному, неожиданному поведению во многих других случаях.

...