函数重载:内置类型与用户定义类型
Function overloading: builtin vs user defined types
template <class T>
void foo(T t) {
t.moo();
}
template <class T>
void f(T t) {
foo(t);
}
struct C {
};
void foo(C) {}
void foo(int) {}
int main() {
C c;
f(c);
return 0;
}
上面的代码编译没有错误。如果行"C c;"被替换为"int c;",编译器将生成错误"类型'int'没有函数'moo'"或类似的东西(MSVC将编译,但那是另一回事(。如果我们将 int 重载替换为模板专用化,一切都会再次工作。如果函数"void foo(int("被移动到模板代码上方,那也可以。这是怎么回事?
> 这是怎么回事?
依赖于参数的查找 (ADL(。当通过至少具有一个类类型参数的非限定名调用函数时,除了对函数名称进行正常名称查找外,还会执行 ADL。ADL 在与类关联的命名空间(基本上是定义类的命名空间(中查找函数名称。
重要的属性是,对于函数模板,非限定名称查找仅考虑在模板定义中可见的名称,但 ADL 还考虑在模板实例化时可见的名称。由于非模板重载是在模板之后声明的,因此普通的非限定名称查找无法找到它们。但是,ADL 可以(并且正在(找到foo(C)
,因为C
是一种类类型。int
不是,因此不会执行 ADL,也不会找到foo(int)
。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- Visual C++(VS2017)中用户定义的转换不明确
- 使用用户定义的参数调用future/async并调用类方法
- 带有用户定义类的c++折叠表达式
- g++用户定义的动态链接库上的全局new和delete运算符
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 修改"std::set"中用户定义类型的值
- 参数包构造函数在类模板中隐藏用户定义的转换
- MAKE:找不到包含的用户定义的头文件?
- C++:用户定义的显式类型转换函数错误
- 从用户定义的类生成格式字符串?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++ 向量与用户定义的类比较?(==, <, >)
- STL 用户定义的二进制操作
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- C++:用户定义的类,以成员字段作为地址