作为参考,这是§14.6.4.2[temp.dep.candidate]“候选函数”的C ++ 03版本:
对于依赖模板参数的函数调用,如果函数名称是unqualified-id而不是template-id,则使用常规查找规则(3.4.1、3.4.2)查找候选函数,除了:
- 对于使用非限定名称查找(3.4.1)进行的查找,仅从模板定义上下文中找到具有外部链接的函数声明。
- 对于使用关联的名称空间(3.4.2)进行的查找,仅在模板定义上下文或模板实例化上下文中找到具有外部链接的函数定义。
如果在关联的名称空间中进行查找时,考虑到所有函数声明以及在所有转换单元中这些名称空间中引入的外部链接的所有函数声明,则该调用是否格式错误或找到更好的匹配项,而不仅仅是考虑在模板定义和模板中找到的那些声明实例化上下文,则程序具有未定义的行为。
您可以编写一些示例代码,这些示例代码将在C ++ 03中很好地定义,而在C ++ 11中则没有:
#include <iostream>
void print(short x) {
std::cout << x;
}
static void print(long x) {
std::cout << x;
}
template<typename T>
void print_twice(T x) {
print(x);
print(x);
}
int main() {
print_twice(0);
// C++03: `void print(long)` does not have external linkage so is not considered.
// Calls `void print(short)` twice
// C++11: Both `void print(long)` and `void print(short)` are viable,
// but neither is better so it is ambiguous (compile time error)
}
(尽管clang和gcc似乎未实现ADL的C ++ 03版本,所以至少在使用这些编译器进行编译时,这永远不会出现)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句