繁体   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