我刚刚经历了一个案例,我不需要在名称空间中声明的函数中为名称空间添加前缀
考虑一下:
namespace fs
{
void ftest();
typedef int uint;
}
void fs::ftest()
{
uint p = 2; // no prefix fs:: needed
}
这实际上并没有让我感到震惊,但我想有一些见解:为什么实际上有效?显然这不是koenig查找。
我正在使用VS 2013
答案 0 :(得分:3)
这是基本的非限定查询。相关规则位于[basic.lookup.unqual]:
在函数的 declarator-id 之后的函数定义中使用的名称,该函数是名称空间
N
的成员(其中,仅出于展示的目的,{{1}应声明全局范围) 在用于使用它的块中或在其封闭块(6.3)中使用之前,应在用于命名空间N
之前声明,或者如果{{1}是一个嵌套的命名空间,应该在N
之一中使用之前声明 封闭命名空间。 [例如:N
-end example]