ADL 与范围解析——更喜欢哪一个?

发布于 2025-01-05 02:22:11 字数 249 浏览 0 评论 0原文

我如何判断是否应该使用 use

my_type bar;
using some_namespace::foo;
foo(bar);

some_namespace::foo(bar);

在调用我的函数 foo 时(不在我的直接范围内), 不是?是否有通用的“规则”来确定您是否应该使用 ADL?我应该“默认”使用哪一个?

How do I tell whether I should use

my_type bar;
using some_namespace::foo;
foo(bar);

instead of

some_namespace::foo(bar);

when calling my function foo (that is not within my immediate scope)? Is there a generic "rule" for figuring out whether you should use ADL or not? Which one should I use "by default"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水溶 2025-01-12 02:22:11

那不是 ADL。在您的两个示例中,foo 都是通过正常查找找到的。使用 ADL 的示例如下:

namespace ns {
    class A { };
    void f(A) { };
}

int main() {
    f(A());
}

这里,f 不是通过正常查找找到的,而是通过参数相关查找找到的(因为它位于命名空间 ns 旁边) A)。无论如何……

尽可能避免 ADL。

ADL 在某些特定场景中是有益的,例如对于运算符重载和可交换概念。但是,应该谨慎使用它,因为它会导致奇怪的、意外的行为在许多其他情况下。

That is not ADL. In both of your examples, foo is found via normal lookup. An example using ADL would be as follows:

namespace ns {
    class A { };
    void f(A) { };
}

int main() {
    f(A());
}

Here, f is not found via normal lookup, but it is found via argument-dependent lookup (because it is in namespace ns alongside A). In any case...

Avoid ADL wherever possible.

ADL is beneficial in certain, specific scenarios, for example for operator overloading and for the swappable concept. However, it should be used sparingly, as it leads to bizarre, unexpected behavior in many other cases.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文