C++ 3.4.2 n3290草稿中与参数相关的名称查找

C++ 3.4.2 n3290草稿中与参数相关的名称查找,c++,c++11,argument-dependent-lookup,name-lookup,C++,C++11,Argument Dependent Lookup,Name Lookup,ISO草案n3290第3.4.2节第1段中的一点: 当函数调用中的后缀表达式是非限定id时,可以搜索通常非限定查找期间未考虑的其他名称空间,并且在这些名称空间中,可以找到不可见的名称空间范围友元函数声明。对搜索的这些修改取决于参数的类型(对于模板参数,则取决于模板参数的命名空间) 在这里,他们说“这些对搜索的修改取决于参数的类型/模板参数/模板参数的名称空间”…任何人都可以举例说明吗?我尝试使用argumetn类型..请使用模板参数类型和模板参数类型的命名空间expalin考虑一个简单的非限定函

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

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


在这里,他们说“这些对搜索的修改取决于参数的类型/模板参数/模板参数的名称空间”…任何人都可以举例说明吗?我尝试使用argumetn类型..请使用模板参数类型和模板参数类型的命名空间expalin考虑一个简单的非限定函数调用:

foo(x);
ADL意味着
foo
不仅可以在封闭范围和调用所在的名称空间中查找,还可以在
x
类型的名称空间中查找。e、 g.如果
x
std::vector
,则还将搜索命名空间
std
。因此:

int main() {
    std::vector<int> x,y;
    swap(x,y);
}
将调用
mynamespace::foo()

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

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);
}
名称空间mynamespace{
模板
结构mytemplate
{};
模板
空条(T常数&){}
}
模板
结构包装器{};
int main(){
包装纸x;
巴(x);
}
即使
wrapper
位于全局命名空间中,也会找到
mynamespace::bar
,因为
x
使用的模板参数是
mynamespace::mytemplate

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);
}