9

ISO草案n3290第3.4.2节第1段的一点:

当函数调用中的后缀表达式unqualified-id时,可能会搜索在通常的非限定查找期间未考虑的其他命名空间,并且在这些命名空间中,可能会找到以其他方式不可见的命名空间范围的友元函数声明。这些对搜索的修改取决于参数的类型(对于模板模板参数,模板参数的命名空间)。

在这里,他们谈到“对搜索的这些修改取决于参数的类型/模板模板参数/模板参数的名称空间”......任何人都可以举例说明吗?我尝试使用argumetn types..please expalin with template template argument types & namespace of the template argument type

4

1 回答 1

17

考虑一个简单的非限定函数调用:

foo(x);

ADL 意味着foo不仅在封闭范围和调用所在的命名空间中查找,而且还在x. 例如 if xis a std::vector<int>then 名称空间std也会被搜索。因此:

int main() {
    std::vector<int> x,y;
    swap(x,y);
}

没问题,会打电话std::swap()

查找还取决于任何模板参数的命名空间,因此 if xis std::vector<mynamespace::myclass>thenmynamespace也包含在查找中。因此

namespace mynamespace {
    struct myclass {};
    void foo(std::vector<mynamespace::myclass> const&){}
}

int main() {
    std::vector<mynamespace::myclass> x;
    foo(x);
}

会打电话mynamespace::foo()

最后,查找还扩展到用作模板模板参数的任何模板的名称空间。例如

namespace mynamespace {
    template<typename T>
    struct mytemplate
    {};

    template<typename T>
    void bar(T const&) {}
}

template<template<typename> class T>
struct wrapper {};

int main() {
    wrapper<mynamespace::mytemplate> x;
    bar(x);
}

即使wrapperis 在全局命名空间中,mynamespace::bar也会被找到,因为用于的模板模板参数xmynamespace::mytemplate.

于 2011-06-02T08:05:46.700 回答