Обоснование поиска Кенига

В чем смысл поиска Кенига?

Нельзя не думать о нем как о чем-то, что делает ваш код намного сложнее для чтения и более нестабильным.

Разве они не могут определить поиск Кенига так, чтобы он работал только для конкретных случаев (т. Е. Операторов, не являющихся членами) или когда это явно требуется?

2 ответа

Решение

Первоначальная мотивация, IIRC, должна была быть в состоянии написать

std::cout << 42;

без необходимости готовиться std::operator<<(std::ostream&, int) явно.

Если вы хотите отключить зависимый от аргумента поиск, вы можете явно указать имя функции, т.е. использование std::swap вместо swap предотвращать swap чтобы искать в любом пространстве имен, его аргументы будут жить.

ADL также можно использовать с SFINAE для проверки во время компиляции, определена ли какая-либо функция для определенного типа (я позволю вам разобраться с этим в качестве упражнения, в Stackru есть по крайней мере один вопрос по этому поводу).

Самый сильный вариант использования для ADL для таких случаев.

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

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

Это также полезно для выбора правильного swap функция в общем коде, поэтому он должен применяться не только к operator функции. Это уже довольно сложная часть стандарта, поэтому создание правил, которые в некоторых случаях не позволяли ему работать, добавило бы дополнительную сложность. Какой будет выгода?

Я не могу придумать какой-либо изящный способ явно запросить его, который был бы значительно менее многословным, чем непосредственный вызов функции в другом пространстве имен и в любом случае сделал бы выражения более сложными.

Мы думаем что-то вроде: return [[ use_adl ]] (a + b); против return A::operator+( a, b );?

Другие вопросы по тегам