簡體   English   中英

ADL 和 typedef

[英]ADL and typedefs

簡而言之,我試圖了解 C++ 中參數相關查找的行為。 我不清楚 ISO/IEC 14882:2017 (E) 中關於 ADL 的一些聲明。 我希望有人向我澄清它們。

按照標准,

用於指定類型的 Typedef 名稱和 using 聲明對這個集合沒有貢獻。

考慮關聯命名空間時,查找與將關聯命名空間用作限定符 (6.4.3.2) 時執行的查找相同,除了:

  • 關聯命名空間中的任何 using-directive 都將被忽略...

對我來說,這些陳述意味着 ADL 應該完全忽略任何typedefusing發生。 可能,情況並非如此。 考慮以下示例:

#include <iostream>                                                             

using namespace std;                                                            

namespace N2                                                                 
{
    struct B {};

    template <typename T>                                                       
    void func (const T&) {cout << __PRETTY_FUNCTION__ << endl;}  
};

namespace N                                                                     
{
    typedef N2::B C;             
}                                                                               

void tfunc (N::C) {}                                                     

int main ()                                                     
{                                                                                                                      
    func(tfunc);                                                                 
}

它有效,即編譯器能夠找到func 那么,標准中的那些引用實際上是什么意思?

這個答案由@IgorTandetnik 提供。

標准所說的是N2tfunc的關聯命名空間之一,但N不是。 換句話說, void tfunc (N::C)工作原理與void tfunc(N2::B)完全相同。 如果在您的示例中,您將 func 移至N ,則不會找到它,盡管表面上tfunc的聲明提到了N

實際上,如果您只是進一步閱讀標准,您就會明白為什么您的代碼有效。 具體來說,N3337 [basic.lookup.argdep]/2如下圖【重點我的】:

命名空間和類的集合按以下方式確定:

...

...

如果 T 是函數類型,則其關聯的命名空間和類是與函數參數類型關聯的命名空間和類以及與返回類型關聯的命名空間和類。

如您所見,如果傳遞的參數是函數類型(在您的情況下為tfunc )、與所有參數關聯的類型( N2::B是唯一類型)以及返回類型( void - 基本類型,所以不計算在內)被認為是創建一組關聯的命名空間。

暫無
暫無

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

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