關于命名空間限定的問題:為什么下面沒有推斷出函式的命名空間?
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();
}
uj5u.com熱心網友回復:
C 的這個特定部分通常可以稱為“非限定名稱查找”。該術語描述了在 C 程式中獲取單個識別符號,然后確定它所參考的實際型別、物件、函式或類。
例如,rosebud在 C 程式中可以呼叫很多東西,所以
rosebud();
this 可以參考同名的類方法,并且 this 呼叫它。或者這可能是一個帶有多載()運算子的物件,它呼叫它。也可能rosebud()在不同的命名空間中呼叫了一些東西。非限定名稱查找指定這些特定rosebud參考中的哪一個。
struct Z{
void func(){
在這里,我們處于 class 的方法中Z。非限定名稱查找首先查找屬于此類成員的識別符號。僅當未找到時,才會在全域名稱空間中查找非限定名稱,以查看是否存在某些內容。
func(int{}); // does not compile
嗯,這個類中恰好有一個方法同名func,所以 thisfunc的非限定名查找決議到這個方法。這失敗了,因為該func方法沒有引數。
不合格名稱查找考慮不合格識別符號的確切位置。當它出現在類中時,非限定名稱查找首先搜索類的成員。
即使func在全域范圍內也有一個函式,不合格的查找會找到類方法,就是這樣(參考參考的鏈接):
[不合格] 名稱查找檢查如下所述的范圍,直到找到至少一個任何型別的宣告,此時查找停止并且不再檢查范圍。
路的盡頭。全域命名空間中也有 a 的事實func無關緊要。對于不合格的名稱查找,一旦找到“某物”,它就會更好地作業,否則。
這些只是非限定名稱查找的規則之一。
X::func(int{}); // this works
嗯,是。func這在命名空間中顯式參考X。此符號(部分)使用顯式命名空間參考進行限定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/412623.html
標籤:
