CPP_GEEK Telegram 339
Что такое 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
👍12😁2👾1



tgoop.com/cpp_geek/339
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

It’s yet another bloodbath on Satoshi Street. As of press time, Bitcoin (BTC) and the broader cryptocurrency market have corrected another 10 percent amid a massive sell-off. Ethereum (EHT) is down a staggering 15 percent moving close to $1,000, down more than 42 percent on the weekly chart. ZDNET RECOMMENDS You can invite up to 200 people from your contacts to join your channel as the next step. Select the users you want to add and click “Invite.” You can skip this step altogether. The group also hosted discussions on committing arson, Judge Hui said, including setting roadblocks on fire, hurling petrol bombs at police stations and teaching people to make such weapons. The conversation linked to arson went on for two to three months, Hui said. How to Create a Private or Public Channel on Telegram?
from us


Telegram C++ geek
FROM American