根据 C++ 标准(6.3.6 命名空间范围)
2 命名空间成员也可以在 :: 范围之后引用
解析运算符 (8.1) 应用于其命名空间的名称或
命名空间的名称,它在 a 中指定成员的命名空间
使用指令;见 6.4.3.2。
而且全局命名空间没有名字。
所以这条记录
::flann::SearchParams param_k_;
表示名称flann 应在全局命名空间或其内联命名空间之一中进行搜索。或者,如果未找到名称,则搜索在全局命名空间中隐式(对于未命名的命名空间)或显式(递归)使用指令指定的所有命名空间。
这是一个演示程序
#include <iostream>
int x = 1;
inline namespace N1
{
int y = 2;
}
int main()
{
int x = 10;
int y = 20;
std::cout << "x + ::x = " << x + ::x << '\n';
std::cout << "y + ::y = " << y + ::y << '\n';
return 0;
}
它的输出是
x + ::x = 11
y + ::y = 22
由于全局命名空间的内联命名空间有自己的名字,所以最后一条语句也可以改写为
std::cout << "y + N1::y = " << y + N1::y << '\n';
甚至喜欢
std::cout << "y + ::N1::y = " << y + ::N1::y << '\n';
下面有一个更复杂的例子
#include <iostream>
int x = 1;
inline namespace N1
{
int y = 2;
}
namespace
{
int y = 3;
}
int main()
{
int x = 10;
int y = 20;
std::cout << "x + ::x = " << x + ::x << '\n';
std::cout << "y + ::y = " << y + ::y << '\n';
return 0;
}
对于名称::y 的限定名称查找没有歧义,因为搜索的第一组命名空间是指定的命名空间(在本例中为全局命名空间)及其内联命名空间。在这组命名空间中可以找到名称 y。否则编译器将继续在全局命名空间的未命名命名空间中搜索名称 y。