- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。
最好我想知道:
最佳答案
Koenig 查找,或 Argument Dependent Lookup ,描述了编译器如何在 C++ 中查找非限定名称。
C++11 标准 § 3.4.2/1 指出:
When the postfix-expression in a function call (5.2.2) is an unqualified-id, other namespaces not considered during the usual unqualified lookup (3.4.1) may be searched, and in those namespaces, namespace-scope friend function declarations (11.3) not otherwise visible may be found. These modifications to the search depend on the types of the arguments (and for template template arguments, the namespace of the templateargument).
简单来说,Nicolai Josuttis 说1:
You don’t have to qualify the namespace for functions if one or more argument types are defined in the namespace of the function.
一个简单的代码示例:
namespace MyNamespace
{
class MyClass {};
void doSomething(MyClass) {}
}
MyNamespace::MyClass obj; // global object
int main()
{
doSomething(obj); // Works Fine - MyNamespace::doSomething() is called.
}
在上面的例子中,既没有using
声明也没有using
指令,但编译器仍然正确识别了非限定名称doSomething()
作为在命名空间 MyNamespace
中通过应用 Koenig 查找 声明的函数。
该算法告诉编译器不仅要查看本地范围,还要查看包含参数类型的命名空间。因此,在上面的代码中,编译器发现对象 obj
,即函数 doSomething()
的参数,属于命名空间 MyNamespace
。因此,它查看该命名空间以找到 doSomething()
的声明。
如上面的简单代码示例所示,Koenig 查找为程序员提供了便利和易用性。如果没有 Koenig 查找,程序员将需要重复指定完全限定名称,或者使用大量 using
声明。
过度依赖 Koenig 查找会导致语义问题,有时会让程序员措手不及。
考虑 std::swap
的例子,这是交换两个值的标准库算法。使用 Koenig 查找时,在使用此算法时必须谨慎,因为:
std::swap(obj1,obj2);
可能不会表现出与以下相同的行为:
using std::swap;
swap(obj1, obj2);
使用 ADL,调用哪个版本的 swap
函数将取决于传递给它的参数的命名空间。
如果存在命名空间 A
,并且如果 A::obj1
、A::obj2
和 A::swap()
存在,那么第二个示例将导致调用 A::swap()
,这可能不是用户想要的。
此外,如果由于某种原因 A::swap(A::MyClass&, A::MyClass&)
和 std::swap(A::MyClass&, A::MyClass& )
被定义,那么第一个示例将调用 std::swap(A::MyClass&, A::MyClass&)
但第二个不会编译,因为 swap(obj1, obj2)
会产生歧义。
因为它是由前 AT&T 和贝尔实验室研究员和程序员设计的, Andrew Koenig .
标准 C++03/11 [basic.lookup.argdep]:3.4.2 参数相关名称查找。
关于c++ - 什么是 "Argument-Dependent Lookup"(又名 ADL,或 "Koenig Lookup")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47078433/
我正在构建一个游戏,例如 Same Game ,当我必须创建一个新关卡时,我刚刚运行了一个算法来用 N 种颜色填充板子,这个算法随机填充板子,但显然以这种方式生成的关卡并不是都有解决方案。 我必须做一
有两个 TFLearn 项目 TF Learn (aka Scikit Flow) https://github.com/tensorflow/tensorflow/tree/master/tenso
我正在尝试使用代码从 NSDictionary 中解析一个整数 [activeItem setData_id:[[NSString stringWithFormat:@"%@", [dict valu
是否有在线资源描述 VC10 与 VC9 相比代码生成的变化? 我不是在谈论 c++0x 和其他不错的功能(例如内置 static_assert),也不是在谈论精致的 UI。我需要知道的是,由于优化、
那里。我是 Swift 的初学者,正在尝试将旧程序转换为 Swift3。我设法修复了一堆错误,但我无法使该功能正常工作。 fileprivate func extractEntitlements(_
我正在尝试实现 Easy Game Center link但我得到这个错误: Cannot convert value of type 'NSRange' (aka 'NSRange') to exp
我是 Swift 的新手,我正在尝试按照 lynda.com 上的类(class)编写一个简单的类(class)此代码在视频中运行良好,但在我的系统上出现错误。 protocol JSONDecoda
我的代码中有一个错误,例如“无法将类型‘NSRange’(又名‘_NSRange’)的值转换为预期的参数类型‘Range’(又名‘Range’)”,但我不知道如何解决这个问题请任何人帮助我? 我在这里
检查字符串字符的范围时出现此错误... @objc func textField(textField: UITextField, shouldChangeCharactersInRange range
我正在尝试用属性字符串替换子字符串。以下是我的代码。 let searchText = self.searchBar.text! let name = item.firstName ?? "" let
string convert(string name) { string code = name[0]; ... } 我从这一行得到“没有从'value_type'(又名'char')到'st
标题说明了一切,我相信。我只是好奇 () -> () 是否充当函数的参数... class Test { var isAwesome = true func loadData (callbac
我正在编写这个很棒的应用程序,至少我认为它很棒,在 C 中与 GObject 的完美结合,过了一段时间我开始遇到这个非常非常奇怪的错误。我也相信已经注意到它并不总是出现。然而,这可能只是 IDE 的错
我一直在尝试使用类型族来抽象 UI 工具包。当我尝试使用 HLists (http://homepages.cwi.nl/~ralf/HList/) 来改进 API 时,我陷入了困境。 我的 API
在 Scala 中,as explained in the PR that introduced it , parasitic允许偷窃 execution time from other thread
我在网上看到过这个关于加载效果的回车示例,但我无法正确理解它。为什么它必须是 2 \rLoading 而不是 1?有人可以给我解释一下吗? for (int j = 0; j < 3; j++) {
我有一个字符串列表 strs = [ 'foo', 'bar' ] 和一些字典 foo = {'a': 1, 'b': 2}, bar = {'a': 3, 'b': 4}。我想使用 with_ite
我有一个由许多点组成的LineString(坐标字符串),我想计算沿线最近的距离(从第一个点到最后一个点,方向性很重要)到一个点,就像这样说的:"project()" calculation 如果我不
所以最近我确实为我的业务购买了一些模板。它们基于 HTML/CSS/JQUERY/JS/PHP。 问题如下:在我的领域,并发率非常高,人们下载模板并自己使用它们是很常见的。由于我确实为它们付出了很多,
我认为这很容易找到预制的,但似乎我在网上找到的任何解决方案都只能解决部分问题。 我想对用户提供的文件名列表进行排序(这些文件大多以人和/或地址命名),有时使用不同的语言(主要是德语,带有一些法语和意大
我是一名优秀的程序员,十分优秀!