推断独立函数的命名空间
Inferring namespace of freestanding function
命名空间限定问题:为什么不是下面推断的函数的命名空间?
namespace X {
void func(int) {}
struct Z{
void func(){
//func(int{}); does not compile
X::func(int{}); // this works
}
};
}
int main() {
X::Z z;
z.func();
}
C++ 的这个特定部分可以是 generally called "unqualified name lookup"。该术语描述了在 C++ 程序中采用单个标识符,然后确定它正在引用哪个实际类型、对象、函数或 class。
例如,在C++程序中可以有很多东西叫做rosebud
,所以
rosebud();
This可以引用这个名字的一个class方法,this调用它。或者这可能是一个具有重载 ()
运算符的对象,它会调用它。在不同的命名空间中也可能有一个叫做 rosebud()
的东西。非限定名称查找指定了这些特定 rosebud
引用中的哪一个。
struct Z{
void func(){
这里是classZ
的方法。非限定名称查找首先查找属于此 class 的成员的标识符。 只有在找不到时才会在全局命名空间中查找不合格的名称,看看是否有东西。
func(int{}); // does not compile
嗯,在这个class中恰好有一个名为func
的方法,所以这个func
的非限定名称查找解析到这个方法。这失败了,因为 func
方法没有参数。
非限定名称查找会考虑非限定标识符的确切位置。当它出现在 class 中时,非限定名称查找首先搜索 class 的成员。
即使在全局范围内也有一个 func
函数,非限定查找会找到 class 方法,仅此而已(引用自 link):
[unqualified] name lookup examines the scopes as described below,
until it finds at least one declaration of any kind, at which time the
lookup stops and no further scopes are examined.
路的尽头。全局名称空间中还有一个 func
这一事实并不重要。对于不合格的名称查找,一旦找到“某物”,它会更好地工作,否则。
这些只是不合格名称查找的规则之一。
X::func(int{}); // this works
嗯,是的。这明确引用 X
命名空间中的 func
。此符号(部分)使用显式名称空间引用限定。
命名空间限定问题:为什么不是下面推断的函数的命名空间?
namespace X {
void func(int) {}
struct Z{
void func(){
//func(int{}); does not compile
X::func(int{}); // this works
}
};
}
int main() {
X::Z z;
z.func();
}
C++ 的这个特定部分可以是 generally called "unqualified name lookup"。该术语描述了在 C++ 程序中采用单个标识符,然后确定它正在引用哪个实际类型、对象、函数或 class。
例如,在C++程序中可以有很多东西叫做rosebud
,所以
rosebud();
This可以引用这个名字的一个class方法,this调用它。或者这可能是一个具有重载 ()
运算符的对象,它会调用它。在不同的命名空间中也可能有一个叫做 rosebud()
的东西。非限定名称查找指定了这些特定 rosebud
引用中的哪一个。
struct Z{
void func(){
这里是classZ
的方法。非限定名称查找首先查找属于此 class 的成员的标识符。 只有在找不到时才会在全局命名空间中查找不合格的名称,看看是否有东西。
func(int{}); // does not compile
嗯,在这个class中恰好有一个名为func
的方法,所以这个func
的非限定名称查找解析到这个方法。这失败了,因为 func
方法没有参数。
非限定名称查找会考虑非限定标识符的确切位置。当它出现在 class 中时,非限定名称查找首先搜索 class 的成员。
即使在全局范围内也有一个 func
函数,非限定查找会找到 class 方法,仅此而已(引用自 link):
[unqualified] name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.
路的尽头。全局名称空间中还有一个 func
这一事实并不重要。对于不合格的名称查找,一旦找到“某物”,它会更好地工作,否则。
这些只是不合格名称查找的规则之一。
X::func(int{}); // this works
嗯,是的。这明确引用 X
命名空间中的 func
。此符号(部分)使用显式名称空间引用限定。