【问题标题】:ADL and typedefsADL 和 typedef
【发布时间】:2019-12-09 09:35:04
【问题描述】:

简而言之,我试图了解 C++ 中依赖于参数的查找的行为。我不清楚 ISO/IEC 14882:2017 (E) 中关于 ADL 的一些声明。我希望有人能向我澄清。

按照标准,

用于指定类型的 Typedef 名称和 using-declarations 不参与此集合。

在考虑关联的命名空间时,查找与执行的查找相同 关联命名空间用作限定符(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。那么,这些标准中的引用实际上是什么意思?

【问题讨论】:

    标签: c++ templates language-lawyer argument-dependent-lookup


    【解决方案1】:

    此答案由@IgorTandetnik 提供。

    标准的意思是N2tfunc 的关联命名空间之一,但N 不是。换句话说,void tfunc (N::C) 的工作方式与void tfunc(N2::B) 完全相同。如果在您的示例中,您将 func 移动到 N,则不会找到它,尽管表面上 tfunc 的声明提到了 N

    【讨论】:

      【解决方案2】:

      实际上,如果您进一步阅读该标准,您就会明白为什么您的代码有效。具体来说,N3337 [basic.lookup.argdep]/2 如下图[强调我的]:

      命名空间和类的集合通过以下方式确定:

      ...

      ...

      如果 T 是函数类型,其关联的命名空间和类就是与 函数关联的那些 参数类型和那些与返回类型相关的。

      如您所见,如果传递的参数是函数类型(在您的情况下为tfunc ),则与所有参数关联的类型(N2::B 是唯一类型)以及返回类型(@987654323 @ - 基本类型,因此不计算在内)被认为是创建一组关联的命名空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        相关资源
        最近更新 更多