Обоснование поиска Кенига
В чем смысл поиска Кенига?
Нельзя не думать о нем как о чем-то, что делает ваш код намного сложнее для чтения и более нестабильным.
Разве они не могут определить поиск Кенига так, чтобы он работал только для конкретных случаев (т. Е. Операторов, не являющихся членами) или когда это явно требуется?
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 );
?