- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 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/55732031/
大多数时候,简单成员函数的 C++17 推断返回类型可以轻松转换为 C++11 尾随返回类型。 例如中的成员函数 template struct X { T a; auto f() {
以下片段是否正确的 C++ 代码? #include class Foo; std::ostream& operator Message& operator<<(Message& m, T& t
考虑以下代码: enum A : unsigned { a = 1, b = 2, c = 4 }; class B { friend constexpr A operator|(A a1, A
Koenig 查找的基本原理是什么? 无法避免将其视为使您的代码更难阅读且更不稳定的东西。 他们不能定义 Koenig 查找,使其仅适用于特定情况(即:非成员运算符)或明确要求时吗? 最佳答案 IIR
Koenig 查找参数的想法是一件坏事吗? 有了 ADL,我们有: namespace foo { struct bar {}; void baz(bar); } baz(foo::b
作为学习练习,我一直在reimplementing some of the STL algorithm .即使我没有为 std 命名空间 my test code won't compile unle
考虑以下程序: namespace NS2 { class base { }; template int size(T& t) { std:
在编写测试套件时,我需要提供 operator namespace NS1 { class A {}; // this is found by expr in NS2 because of
这个问题的灵感来自 Issue with std::reference_wrapper .比如说,operator bool operator& lhs, const
什么是依赖于参数的查找有哪些好的解释?许多人也称其为Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么不好? 如何运作? 最佳答案 Koenig查找或 Argument Dep
Using code adapted from this answer ,我改编了一个 命名运算符。这是编译器错误: /../ti.cpp:6:31: error: C++ requires a ty
关于什么是参数相关查找有什么好的解释?许多人也称它为 Koenig Lookup。 最好我想知道: 为什么是好事? 为什么是坏事? 它是如何工作的? 最佳答案 Koenig 查找 , 或 Argume
关于什么是参数依赖查找有什么好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查询 , 或
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何运作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何运作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何运作的? 最佳答案 Koenig 查找,或 A
关于什么是参数依赖查找有哪些好的解释?许多人也将其称为 Koenig Lookup。 最好我想知道: 为什么这是一件好事? 为什么这是一件坏事? 它是如何工作的? 最佳答案 Koenig 查找,或 A
我是一名优秀的程序员,十分优秀!