问题标签 [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.
c++ - `decltype` 并将 ADL 查找与非 ADL 查找混合
测试用例
在内部数据类型的情况下,让函数的返回类型与从标头auto foo(T f)
调用时相同:sin(f)
cmath
f
这已破了。不查找 inside sin(f)
,因此只找到返回类型为的变体。下面的程序演示了:decltype
std
C
sin(double)
double
输出:
输出表明返回类型始终double
为foo->float
and foo->double
,仅在 内 ,因为导入所有重载的 ,才找到foo()
正确的类型。sin(float|double)
using std::sin
我想知道在 gremium 中是否已经考虑过这种情况,但这不是我的问题。
问题
我的问题是:
什么是让foo
具有相同返回类型的函数与名称在namespace std
或 ADL-looked-up 的函数相同的明智方法?
非工作解决方法:
标准提案?
使用排列enable_if
的方式是代码是自记录的。enable_if
是元编程的一个很好的练习。但是要快速掌握一个看似简单的功能,恕我直言,这不是正确的事情,因此不符合可维护性的精神。
编辑:我也decltype
习惯于不那么隐晦地使用 SFINAE,因此带有新auto foo() {....}
声明的 C++14 可能无济于事。
c++ - 比 ADL 更喜欢某些功能
我想使用基于范围for
来迭代 UTF8 编码中的 unicode 代码点std::string
。我已经在全局命名空间中定义了我自己的begin
and ,但命名空间中的and是首选(即由 ADL 找到的那些)。有什么方法可以让我更喜欢我自己的功能吗?end
begin
end
std
例子:
我希望它打印BEGINENDasdf
(或ENDBEGINasdf
)但它打印asdf
.
for
除了使用限定名称来编写手册之外,没有其他方法吗?
c++ - 与参数相关的查找相反的解决方法?
C++ 有 ADL(Argument Dependent Lookup),正如其名称所描述的,函数的上下文(命名空间)可以从(任何)参数的上下文(命名空间)中隐含。
我的问题是,是否也可以通过某种技术进行反向操作?反向我的意思是上下文(命名空间)是否可以从被调用函数的上下文中推断出来。某种“函数相关查找”(FDL)。假代码:
我想不出这样做的方法。enum
对于用于对函数选项进行编码的 s,此限制尤其令人讨厌。我想知道是否有一种技术可以模拟这个特性(C++11 也可以)。假代码:
特别是如果 s 有解决方法enum
。
这段代码说明了这个问题:
编辑: @jrok 建议了一种基于定义嵌套命名空间的解决方法。对于这种enum
情况,我得到了这个代码。它仍然有一些噪音(实际上根本没有“依赖”查找),但它是一种改进。
我没有使用,enum class
因为 then Saturday
, Sunday
, etc 不能直接在范围内进行(实际上using longname::days::_
会给我一个编译错误)
c++ - 实现 equal() 和 find()
在下面的代码中,我必须限定equal()
调用(否则我会得到“对重载函数的模糊调用”),但可以调用 unqualified find()
。有什么不同?
我认为它与参数相关查找有关(请参阅this question),但仍然不明白为什么这两个调用不同。
c++ - 为什么在语句“std::cout << std::endl;”中使用“std::endl”时需要命名空间限定,给定依赖于参数的查找?
我正在查看有关参数依赖查找的 Wikipedia 条目,并且(2014 年 1 月 4 日)给出了以下示例:
...带有以下评论:
请注意,std::endl 是一个函数,但它需要完全限定,因为它用作 operator<< 的参数(std::endl 是函数指针,而不是函数调用)。
我的想法是评论不正确(或根本不清楚)。我正在考虑将评论改为说
注意 std::endl 需要完全限定,因为 ADL 不适用于函数调用的参数;它仅适用于函数名称本身。
我是否正确地认为维基百科的评论不正确?我提议的更改是否正确?(即,在这个例子中我对 ADL 的理解是否正确?)
c++ - 调用 std::list::remove_if( function()::predicate ) 没有匹配的函数
std::list::remove_if
那么,不允许在函数内定义谓词并用作参数吗?
考虑以下无法编译的代码:
现在,如果我替换l.remove_if( pred() );
为
它remove_if
在内部进行,它按预期编译和工作。
甚至更多:如果我在 main之外struct pred
定义,两个测试都按预期工作。
这对我来说没有任何意义。
我认为它可能是具有依赖名称和 ADL 之类的东西,但是......参数remove_if
是一个实例,而不是一个类型。确实,这是一个模板函数,并且参数的类型仍然被解析,但是..
有人可以解释发生了什么以及为什么会发生吗?
apache-flex - 在 adl(flash builder 命令行调试器)中获取“无效的应用程序描述符:未知命名空间:library://ns.adobe.com/flex/spark”
获取“无效的应用程序描述符:未知命名空间:库://ns.adobe.com/flex/spark”
将 adl(命令行调试器)用于 flash-builder 4.6 adobe air 项目时
这是一个非常简单的项目
mxml 文件开头是这样的:
我读到了一个类似的问题,解决方案是将 xmlns 值交换为“ http://ns.adobe.com/air/application/3.1”/。
交换值给了我另一个错误:
“无效的应用程序描述符:应用程序文件名必须具有非空值”
还,
这样做的全部原因是我有一个必须运行我的 air 应用程序的程序,所以我需要一种在命令行中运行 flash-builder 项目的方法
我使用adl
这是最好的方法吗?
编辑 :
描述符文件代码:
c++ - 为什么两阶段查找无法选择“交换”的重载版本?
我正在研究这个关于实现用户定义类型函数的最佳实践的微妙问题的迷人答案。(我的问题最初是由讨论向命名空间添加类型的非法性引起的。)swap
std
我不会在这里从上面链接的答案中重新打印代码片段。
相反,我想了解答案。
我在上面链接的答案在第一个代码片段下面,关于重载swap
namespace std
(而不是在该命名空间中专门化它):
如果你的编译器打印出不同的东西,那么它就没有正确地为模板实现“两阶段查找”。
然后答案继续指出,专业化swap
(namespace std
而不是重载它)会产生不同的结果(专业化情况下的期望结果)。
但是,答案是在另一种情况下进行的:专门为用户定义的模板类交换- 在这种情况下,再次没有达到预期的结果。
不幸的是,答案只是陈述了事实。它没有解释为什么。
有人可以详细说明该答案,并在该答案中提供的两个特定代码片段中描述查找过程:
swap
为用户定义的namespace std
非模板类重载(如链接答案的第一个代码片段)专注
swap
于namespace std
用户定义的模板类(如链接答案的最终代码片段)
在这两种情况下,都会调用泛型std::swap
,而不是用户定义的swap
。为什么?
(这将阐明两阶段查找的性质,以及实现用户定义的最佳实践swap
的原因;谢谢。)
c++ - 如何消除 ADL 调用与不同命名空间中的候选者的歧义?
给定以下课程:
现在,在另一个上下文中,我有一个std::vector<foo>
并且想要对其执行以下算法:
这会引发一个巨大的模板错误消息,归结为对std::tr1::ref
or的模棱两可的调用boost::ref
。boost::static_visitor
如果我从一切中删除基类,则foo
一切正常。
据我了解,问题在于在代码的深处,在没有命名空间限定std::tr1::bind
的情况下调用了 a 。ref(arg)
因为bind
在命名空间std::tr1
中,std::tr1::ref
所以在范围内。但是,因为foo
继承自命名空间中的类boost
,ADL 也会找到boost::ref
. 这种理解正确吗?
由于我需要那个基类(它是Boost.Variant的一部分),我需要知道这里是否有任何方法可以从我的代码中消除这个调用的歧义?
注意:我在这里坚持使用 C++03,因此使用std::tr1
.
c++ - 为什么 Boost.Range range_begin/end 自由函数对 const 和非 const 引用都进行了重载?
我在Boost.Range中发现了这个有趣的部分:
在提供独立功能range_begin/end()
时,文档声明:
...
range_begin()
并且range_end()
必须为两个const
和mutable
引用参数重载。
事实上,查看它们在 中的默认值end.hpp
,我们看到:
您会注意到(文档中给出的示例也这样做)两个版本都返回相同的Iterator
类型。
为什么我们首先需要两个重载?是为了让ADL工作吗?