C++ 函数重载、编译时编程及可变模板参数详解
1. 函数重载
在 C++ 中,函数重载允许我们使用相同的函数名来定义多个不同参数列表的函数。编译器会根据调用时提供的参数来选择最合适的函数。
1.1 初始化列表与构造函数
编译器认为 std::initializer_list 初始化比其他构造函数列表初始化更好。例如, std::string{42, 'x'} 不会调用 std::string(42, 'x') 构造函数,因为编译器更倾向于将 {42, 'x'} 视为 std::initializer_list ,这会生成一个包含两个字符(代码点为 42 的字符和字母 ‘x’)的字符串,而不是包含 42 个字母 ‘x’ 的字符串。
如果参数类型不是类,并且花括号列表中只有一个元素,编译器会从花括号中提取值,并应用由该值导致的正常隐式转换序列(ICS)。
1.2 重载解析的决胜规则
当编译器无法明确找到一个比其他函数排名更高的函数时,它会按以下顺序应用一些最终规则来尝试选出一个获胜者:
- 虽然返回类型不被视为重载解析的一部分,但如果重载函数调用用于用户定义的初始化,调用更好标准转换序列的函数的返回类型获胜。
- 非模板函数优先于函数模板。
- 更特化的函数模板优先于较不特化的函数模板。(引用或指针模板参数比非引用或非指针参数更特化。常量参数比非常量参数更特化。)
- 否则,编译器会报告歧义错误。
以下是一个
超级会员免费看
订阅专栏 解锁全文
877

被折叠的 条评论
为什么被折叠?



