CTTCG 01 Function Templates
2023 年 5 月 7 日
两个 type traits
std::decay_t
可以去引用、去限定符、函数/数组变指针;std::common_type_t
用三元运算符获得更“宽泛”类型。
函数模板默认参数
模板默认参数可以放在最前面,不像普通函数只能把带有默认值的参数放在最后。而且函数模板可以明确指定开头几个参数,让后面的参数由推导规则生成。
函数重载参数匹配优先级
优先级排序
- perfect match
- decay,或者修改指针的内外层 const 属性(volatile 应该也算吧?)
比如
char *
到char const *
- promotion,比 int 小的转到 int 或更大的整数,或者 float 到 double。 举例:bool 到 char 不是 promotion,而是 standard conversion
- standard conversion,包括 int to float,子类(值/引用/指针)向基类(值/引用/指针)转换
- 用户定义的转换,包括标准库的类
- 与可变长参数列表匹配,也就是
(...)
例外:f(...)
和f(void)
参数类型是同级别的,因为没有提供参数,编译器不知道哪一个匹配更合适。
以上参数匹配不涉及到值类型、左引用、右引用的区别。只要引用属性能够匹配,就不区分优先级。比如同时匹配到 f(int)
和 f(int &)
编译器就会抱怨函数调用 ambiguous。