我在浏览关于ADL(依赖参数名称查找)的维基百科条目时,发现以下示例(2014年1月4日):
#include<iostream>
int main()
{
std::cout << "Hello World, where did operator<<() come from?" << std::endl;
}
...带有以下注释:
请注意,std::endl是一个函数,但它需要完全限定, 因为它被用作operator<<的参数(std::endl是一个函数指针,而不是函数调用)。
我的想法是,这个注释是不正确的(或者只是不清楚)。我正在考虑改变注释,以便说:
请注意,std::endl需要完全限定, 因为ADL不适用于函数调用的参数;它仅适用于函数名称本身。
我是否正确地理解了维基百科的注释?我的修改是否正确?(即,在这个例子中,我对ADL的理解是否正确?)
cout
需要命名空间限定。 - user541686namespace Foo { class A{}; class B{}; void f(A, B){} }
接着Foo::A a; f(a, B());
是否正确地定位了名称B
?(如果我理解正确的话,这将是ADL在命名空间内成功定位函数调用的参数类型,给定另一个已知类型定义在该命名空间中的函数参数。) - Dan Nissenbaum