簡體   English   中英

ADL不查找靜態成員函數嗎?

[英]Doesn't ADL looks up static member functions?

這是來自依賴參數的查詢的后續問題, 只搜索名稱空間或類嗎? ,其中@DavidRodríguez說“ADL將查看該類型的封閉命名空間,以及類型本身內部 ”。 我可能錯了他想說的但是我試着這個例子:

struct foo{
    static void bar(foo* z){}    
};

int main(){
    foo* z;
    bar(z);
}

它沒有編譯,產生錯誤“'bar'未在此范圍內聲明”。 是不是ADL不考慮靜態成員函數? 我的意思是在示例中關聯的類是foo所以不會ADL看到類里面? 任何人都可以在這里簡化規則嗎?

他可能是這個意思:

struct foo{
    friend void bar(foo* z){}    //not static, its friend now
};

foo* z;
bar(z); //fine now

但是技術上bar()不在foo 里面 仍然foo的封閉命名空間中。

-

編輯:

正如他所說的那樣,他確實意味着friend (強調我的):

最好的例子是在類型中定義友元函數

他的例子進一步說明了。 可能你需要閱讀“內部定義”,而不僅僅是“內部”。

“定義”這個詞就是有所不同的,因為看起來函數的名稱 bar被引入到類的范圍內,但實際上,名稱bar被引入到foo的封閉命名空間中(參見§3.3.1) / 3-4和§11.3/ 6)。

這是一個更好的例子:

namespace Demo
{
     struct foo
     {
       friend void bar(foo* z){}
     };
}

foo *z;
bar(z); //foo (type of z) is inside Demo, so is bar
        //(even though bar is defined inside foo!)

bar(NULL);    //error - NULL doesn't help ADL.
bar(nullptr); //error - nullptr doesn't help ADL.

bar(static<foo*>(NULL)); //ok - ADL

請注意,即使引入名稱空間Demo ,名稱bar 也是隱藏的 ,因此無法使用通常的名稱查找從外部使用:

using namespace Demo; //brings ALL (visible) names from Demo to current scope

bar(NULL); //STILL error - means bar is invisible

要么,

Demo::bar(NULL);       //error - not found
Demo::foo::bar(NULL);  //error - not found

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM