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