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. 2022-03-24:你被请来给一个要举办高尔夫比赛的树林砍树,树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数 表示有树的单元格,

    2022-03-24:你被请来给一个要举办高尔夫比赛的树林砍树,树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数 表示有树的单元格, ...

  2. 2022-01-20: 矩形区域不超过 K 的最大数值和。 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一

    2022-01-20: 矩形区域不超过 K 的最大数值和. 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和. 题目数据保证总会存在一 ...

  3. C#识别文字内容并分类输出0和1

    这个代码最开始是为了处理在调查问卷的结果,问卷星等调查问卷有一部分是用汉字描述的多选题,问卷系统在输出问卷的时候直接就是将汉字进行输出,而我们在进行数据分析(二元logistic或多项logistic ...

  4. 电赛控制类PID算法实现

    一.什么是PID 学过自动控制原理的对PID并不陌生,PID控制是对偏差信号e(t)进行比例.积分和微分运算变换后形成的一种控制规律.PID 算法的一般形式: PID控制系统原理框图 二.PID离散化 ...

  5. Python pip 修改镜像源为豆瓣源

    配置文件 编辑配置文件 ~/.pip/pip.conf,添加内容如下: [global] index-url = https://pypi.doubanio.com/simple trusted-ho ...

  6. odoo总结---类继承和视图继承

    类继承 自从有了类,就有继承,继承是类最大的特性,ODOO开发有不例外,先ODOO集采总结如下: 1)类继承:扩展类中没有_name属性,因为它继承了父类的_name.对现有模型的扩展, 添加新功能, ...

  7. ODOO13之12:Odoo 13开发之报表和服务端 QWeb

    报表是业务应用非常有价值的功能,内置的 QWeb 引擎是报表的默认引擎.使用 QWeb 模板设计的报表可生成 HTML 文件并被转化成 PDF.也就是说我们可以很便捷地利用已学习的 QWeb 知识,应 ...

  8. Django 有关 models 数据类型介绍:

    在model中添加字段的格式一般为:  field_name = field_type(**field_options) 一  field options(所有字段共用) 1  null   默认为F ...

  9. 基于 Web 的 Linux 终端 WebTerminal

    有时候用公共电脑,或者在没有安装 putty.xshell 之类的终端的电脑上访问或展示服务器上的一些资料数据,甚至是在运维平台开发中想要嵌入 WebTerminal 功能,于是找到了这个项目--基于 ...

  10. ChatGLM 拉取清华git项目

    windows使用nvdia显卡运行ChatGLM 1. 安装nvidia显卡驱动 https://developer.nvidia.com/cuda-11-8-0-download-archive? ...