问题标签 [argument-dependent-lookup]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
309 浏览

c++ - 确定“泛型函数”的返回类型

假设,我想开发一个通用库,它应该可用于类似数字的类型,包括双精度类型和用户定义类型。我现在面临的问题是我不知道如何编写函数模板的返回类型,就像这样:

using 声明使此函数模板的主体适用于原始类型,因为它们没有关联的命名空间(因此,没有 ADL)。但是我希望 transmogrify 使用专门的 abs 函数,以防用户定义类型的作者提供他自己的 abs 函数。我不能简单地使用

因为这不适用于双打,因为 std::abs 不在范围内(据我所知)。但是写作

将禁用 ADL。但禁用 ADL 不是一种选择。此外,专门的 abs 函数返回的值可能不是 T 类型,而是其他类型。

关于如何解决返回类型问题的任何想法,同时 (a) 保留 ADL 和 (b) 对于不提供专门 abs 的类型使用某些默认函数(如本例中的 std::abs )。

0 投票
1 回答
2448 浏览

c++ - C ++中的参数相关查找

这是如何运作的?它与ADL有关吗?

有人可以告诉我为什么我不能使用类似的东西

0 投票
2 回答
1363 浏览

c++ - 为什么 ADL 优先于“std 命名空间”中的函数但等于用户定义命名空间中的函数?

我有两个用于演示目的的 ADL 片段。两个片段都已由 VC10、gcc 和 comeau C++ 编译器编译,并且所有三个的结果都是相同的。

<1>针对用户定义命名空间的 using 指令的 ADL:

编译结果:

这是预期的,因为 ADL 不优先于正常查找结果加上 ADL 不是二等公民,ADL 搜索结果与正常(非 ADL)未限定查找联合。这就是为什么我们有歧义。

<2>针对 std 命名空间的 using 指令的 ADL:

这个编译好了。

The result is compiler choose ADL result(it take precedent of std::swap), meaning N::swap() at 'point 1' will be called. Only when in the absense of 'point 1'(say if I comment out that line), the compile will use the fall back std::swap instead.

Note this way has been used in many places as a way to overwrite the std::swap. But my question is, why does ADL takes precedence over 'std namespace'(case2) but is considered equal to user-defined namespace function(case1)?

Is there a paragraph in C++ standard that says so ?

================================================================================= Edit after reading useful answers, might be helpful to others.

So I have tweaked my snippet 1 & now the ambiguity is gone and compile apparantly prefer Nontemplate function when doing overloading resolution !

I have also tweaked my snippet 2. Just to make the ambiguity appear just for fun !

gcc and comeau both say ambiguity as expected:

BTW VC10 stupid as usual let this one pass ok unless I remove the 'using std::swap'.

Just a bit more to write: C++ overloading can be tricky(30+ page in C++ standard), but at appendlix B of there is a very readable 10 page there...

Thanks for all the nice inputs, now it's clear.

0 投票
1 回答
130 浏览

c++ - 通常的非限定查找和依赖于参数的名称查找(ADL)

对于不合格的名称查找,“通常不合格的查找”和“依赖于参数的名称查找”(ADL),我在标准中找不到哪个先发生?

同样,由于两者都试图向重载候选集添加一些东西,但顺序似乎并不重要。但是仍然很高兴知道哪个先发生。

谢谢

0 投票
1 回答
239 浏览

c++ - 覆盖 ADL 选择的重载

我正在使用一个有缺陷的库operator<<,我想用我自己的版本替换它。它遵循 ADL 根据参数在库名称空间中的成员资格选择重载的习惯用法。有没有办法让 C++ 选择我自己的operator<<

0 投票
1 回答
389 浏览

c++ - c++:模板中非限定名称查找的上下文

我尝试查阅有关do_run的解析的标准,发现“对于使用非限定名查找(3.4.1)或限定名查找(3.4.3)的部分查找,仅找到模板定义上下文中的函数声明”。上下文到底是什么?

在下面的示例中,do_run(int)以某种方式“隐藏” do_run(domain::mystruct),编译器抱怨o can't be converted to int. 如果我注释掉do_run(int)do_run(domain::mystruct)对 可见run,并且代码被编译。这种行为是否与标准中提到的“上下文”有关?在我看来,两者都do_run(int)应该do_run(domain::mystruct)对(可解析的)运行可见。

在存在的情况下do_run(int),我需要一个额外的步骤来do_run(domain::mystruct)进入“上下文”。有三种方式:

  1. 放入do_run(domain::mystruct)命名空间域。
  2. 放入do_run(domain::mystruct)命名空间 lib::details。
  3. using ::do_run在命名空间 lib::details 中添加。

所以我推断上下文是命名空间 lib::details 和命名空间域?

编译器VS2010

0 投票
2 回答
2270 浏览

c++ - iter_swap 的意义何在?

我只是想知道,为什么有人会写这个:

而不是这个?

然后我研究了 的实现iter_swap,当然它只使用swap而不是std::swap因为我们已经在namespace std,无论如何。这让我想到了下一个问题:

为什么会有人写这个:

而不是这个?

我在这里忽略了任何重要的差异/问题吗?

0 投票
2 回答
293 浏览

c++ - 为什么 C++11 不支持这样的名称查找?

编译器抱怨:error C2065: 'X' : undeclared identifier

编译器知道构造函数的参数类型是什么,所以当我将 X 作为参数传递时,编译器应该知道它是一个有效参数。

我知道这不是 ADL(Argument-dependent Name Lookup,也称为 Koenig Lookup),但我认为它很有用且非常方便。因为我不必写如下:

我认为 ADL 规则应该推广到这种情况。

我对吗?

0 投票
1 回答
422 浏览

c++ - 依赖于参数的查找——何时完成、搜索什么以及如何强制(或阻止)它?

我无法理解参数相关(Koenig)查找背后的规则。

考虑下面的代码:

它的输出是:

未使用ADL ( foo1)
已使用 ADL ( foo2)
未使用 ADL ( foo3)

我希望他们所有人都使用 ADL,但令我惊讶的是只有其中一些人使用了 ADL。

ADL 规则背后的(可能是血淋淋的,我知道)细节是什么?
我很好地理解了这个概念,但细节是我遇到的麻烦。

搜索哪些范围,何时搜索,何时不搜索?

是否完全有可能判断是否使用了 ADL 而无需在给定的代码行之前查看所有'#include d 文件?我希望函子和函数在 [not] 屏蔽 ADL 方面表现相同,但显然它们没有。

如果ADL 不是自动完成(例如上面的)并且您不知道类的命名空间(例如在模板中),有什么方法可以强制ADL?

0 投票
1 回答
71 浏览

c++ - 通过 ADL 从另一个函数调用一个函数

我有一个关于 ADL 在一般情况下如何找到类型的问题。具体来说,我有一些“通用”代码,我需要在编译时检查是否存在 ADL 应该找到的函数。例如:

我有一个特征类,它使用“sizeof 技巧”来检查这个 ADL 函数的存在:

trait class/sizeof 技巧本身并不重要(您可以在 C++ Template Metaprogramming 一书中找到详细信息,如果您有兴趣,我会从这本书中找到它)。相反,问题是这种类型特征将不会编译,除非我在确实定义了 DoSomething 的(任意)类型的 #include之后#include 它,例如,

或者,我创建一个带有 DoSomething 函数声明的虚拟类:

并将其(直接或通过 Dummy.h)包含到 HasDoSomething.h 中。通过强制#includes的顺序或插入冗余代码来启动ADL查找似乎并不理想,所以我误解了什么或做错了什么?