C++ 函数参数匹配

1 单个参数匹配

void f(); //f1
void f(int); //f2
void f(int, int); //f3
void f(double, double=3.14);//f4 int main() {
f(5.6); //调用f4
return 0;
}

candidate functions:函数名称相同(f1, f2, f3, f4 都是)。

viable functions:参数个数相同(排除f1, f3),且参数可以转换成相同类型(f2, f4都是viable function)。如果不存在viable functions,则编译器报参数不匹配错误(可以通过linting检查)。 最后决定参数类型是否匹配,如果匹配优先调用,不能则选择可以隐式转换成类型相同的函数。

2 多个参数匹配

void f(); //f1
void f(int); //f2
void f(int, int); //f3
void f(double, double=3.14);//f4 int main() {
f(42, 5.6); //报错,参数模糊
return 0;
}

condidate functions: f1, f2, f3, f4

viable functions: f3, f4

优先级: 精确匹配的参数个数越多优先级越高,参数个数相同优先级相同,如果存在多个最高优先级的函数,则报参数模糊错误。

参数类型转换

优先级:

  1. 精确匹配:包括类型相同, 数组和参数名转换为指针,忽略顶层const
  2. const 转换 (把非const实参传给const形参)
  3. promotion数据提升,如int->long, char->unsigned等
  4. 算术转换或者指针类型转换
  5. 类类型(class-type)转换,如string->bool

Promotion and Arithmetic Conversion

void ff(int); //f1
void ff(short); //f2
void manip(long); //f3
void manip(float); //f4 int main() {
ff('a'); //调用f1,char -> int是promotionO(比int短的数据类型统一promotion为int,
// char->short 是算术转换
manip(3.14); //error: ambiguous call,3.14视为double,double->float和doule->long在优先级上是等价的
return 0;
}

const Arguments

忽略顶层const, 原因是传参的时候实际上进行的是copy过程,即copy一份实参给形参,copy会忽略顶层const

void f(int a);
void f(const int a);//报错,重复定义,两者只能定义一种
void f(int *a);
void f(int* const a);//报错,重复定义,两者只能定义一种

const 转换

void f(int &); //f1
void f(const int &);//f2 int main() {
const int a{0};
int b{0};
f(a); //调用f2(精确匹配)
f(b); //调用f1(没有定义f1时,调用f2)
return 0;
}

另外,

void f(int);
void f(int &); int main() {
int i = 0;
f(i); //报错,ambiguous call
return 0;
}

C++函数参数匹配规则的更多相关文章

  1. Python函数参数与参数解构

    1 Python中的函数 函数,从数学的角度来讲是,输入一个参数,经过一个表达式的处理后得到一个结果的输出,即就是x-->y的一个映射.同样,在Python或者任何编程语言中,函数其实就是实现一 ...

  2. python函数的参数匹配

    版本:一般用python2.7.6 python3.4.3会标注 1.不可变对象(整数.字符串)通过对象引用进行传递,在函数内部不可改变. >>> def f(a): ... a=1 ...

  3. Nginx日志参数、location匹配规则、设置密码

    1.三个参数 a)$http_referer:记录此次请求是从哪个链接访问过来的: 是直接访问,还是从其他网站跳转过来的. 例如:访问:http://www.etiantian.com/,其页面首页是 ...

  4. python基础(三元运算+深浅拷贝+函数参数)

    三元运算 三元运算,又称三目运算,主要作用是减少代码量,是对简单的条件语句的缩写. 书写格式: result = 值1 if 条件 else 值2 即如果条件成立,则将值1赋给result变量,如果不 ...

  5. Django中url匹配规则的补充

    Django中url匹配规则是在urls.py文件中配置的. 1.关于正则匹配优先级 在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条. 在url匹配列表中,如果第一条为正则模 ...

  6. Python函数的作用域规则和闭包

    作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器 ...

  7. 二十一、springboot之定制URL匹配规则(项目中遇到的问题:get方式传参,带有小数点,被忽略)

    一.问题描述: get方式传参,在传送价格,积分时(带有小数点),debug后台微服务接受到的参数,却不带小数点,如:price是0.55,后台接受后却是0 二.解决 在WebConfiguratio ...

  8. SQLite 自定义函数,聚合,排序规则

    SQLite 自定义函数,聚合,排序规则 1.使用自定义函数, 聚合以及排序规则的基本方法是使用回调函数.这些注册的函数的生命周期只存在于应用程序中, 并不存储在数据库文件中, 因此需要在每个连接建立 ...

  9. JS中给函数参数添加默认值(多看课程)

    JS中给函数参数添加默认值(多看课程) 一.总结 一句话总结:咋函数里面是可以很方便的获取调用函数的参数的,做个判断就好,应该有简便方法,看课程. 二.JS中给函数参数添加默认值 最近在Codewar ...

  10. Go的http包中默认路由匹配规则

    # 一.执行流程 首先我们构建一个简单http server: ```go package main import ( "log" "net/http" ) f ...

随机推荐

  1. 2021-02-26:一个数组arr是二叉树的中序遍历结果,每条边的开销是父节点和子节点的乘积,总开销是所有边的开销之和。请问最小总开销是多少?

    2021-02-26:一个数组arr是二叉树的中序遍历结果,每条边的开销是父节点和子节点的乘积,总开销是所有边的开销之和.请问最小总开销是多少? 链接:https://www.nowcoder.com ...

  2. 2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A、B两个区域,第 i 个司机去A可得收入为income[i][0],第 i 个司机去B可得收入为income[i][1],返回所有调

    2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A.B两个区域,第 i 个司机去A可得收入为income[i][0],第 i 个司机去B可得收入为income[i][1],返回所有调 ...

  3. GPUImage框架使用

    GPUImage框架简介 GPUImage框架是一个基于OpenGL ES 2.0的iOS图像和视频处理框架.它充分利用GPU并行计算能力可以实时处理图像和视频,可以让开发者轻松地实现各种滤镜效果. ...

  4. 通过实例了解vue3.3更新的特征

    开场白 5月份,vue团队发布了 vue3.3. 这次小版本的发布主要解决了-- Vue 与 TypeScript 一起使用时的许多长期存在的痛点. 下面我们一起来学习一下vue3.3新特征 准备新新 ...

  5. 在.net项目中添加Husky.Net提交验证

    参考:C# 项目添加 husky - jesn - 博客园 (cnblogs.com) 官方文档:Getting Started | Husky.Net (alirezanet.github.io) ...

  6. Java(if选择、switch选择、循环)

    1.if 选择结构 //语法 if(表达式){ //语句:(表达式为真) }else{ //语句:(表达式为假) } --------------------------------------- 例 ...

  7. auto main()-> int的含义是什么?

    42 https://stackoverflow.com/questions/21085446/what-is-the-meaning-of-auto-main-int/21085530   C++1 ...

  8. 一次性掌握innodb引擎如何解决幻读和不可重复读

    了解mysql的都知道,在mysql的RR(可重复)隔离级别下解决了幻读和不可重复.你知道RR下是怎么解决的吗,很多人会回答是通过MVCC和next-key解决的,具体是怎么解决的,今天来重点分析下. ...

  9. P3133 [USACO16JAN] Radio Contact G 无线电通话

    P3133 [USACO16JAN] Radio Contact G 无线电通话 目录 P3133 [USACO16JAN] Radio Contact G 无线电通话 [USACO16JAN] Ra ...

  10. Unity中的PostProcessScene:深入解析与实用案例

    Unity中的PostProcessScene:深入解析与实用案例 在Unity游戏开发中,我们经常需要对场景进行后处理,以实现更丰富的视觉效果.Unity提供了一个名为PostProcessScen ...