Обоснование поиска Кенига - PullRequest
6 голосов
/ 05 января 2011

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

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

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

Ответы [ 2 ]

5 голосов
/ 05 января 2011

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

std::cout << 42;

без необходимости квалифицироваться std::operator<<(std::ostream&, int) явно.

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

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

3 голосов
/ 05 января 2011

Самый сильный вариант использования для 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 );?

...