tgoop.com/cpp_geek/339
Create:
Last Update:
Last Update:
Что такое 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, или параметры шаблона).
➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/339