Что такое ADL и как она может вас подставить
Что такое ADL и как она может вас подставить Argument-Dependent Lookup (ADL) — это фича, которая может как упростить код, так и привести к сюрпризам. Представьте: namespace math { struct Vec {}; void print(const Vec&) { std::cout << "Vec\n"; } } void foo() { math::Vec v; print(v); // компилятор найдёт math::print через ADL! } Хотя print не в текущем скоупе, компилятор ищет её в namespace аргумента v, т.е. math. Это и есть ADL. Звучит удобно. Но... ⚠️ Опасность: namespace lib { struct Widget {}; void process(const Widget&) { std::cout << "lib::process\n"; } } void process(int) { std::cout << "global::process\n"; } void bar() { lib::Widget w; process(w); // вызовет lib::process, а не global::process! } Такой вызов может внезапно потянуть неожиданные функции, особенно в generic-коде (например, в шаблонах), где ADL может найти «лишнее». ✅ Best practices: * Не полагайся на ADL без крайней нужды. * Используй ::qualified::names для ясности. * В шаблонах — лучше явно передавать функции (через policy, traits, или параметры шаблона).