C++函数参数匹配规则
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
优先级: 精确匹配的参数个数越多优先级越高,参数个数相同优先级相同,如果存在多个最高优先级的函数,则报参数模糊错误。
参数类型转换
优先级:
- 精确匹配:包括类型相同, 数组和参数名转换为指针,忽略顶层const
- const 转换 (把非const实参传给const形参)
- promotion数据提升,如int->long, char->unsigned等
- 算术转换或者指针类型转换
- 类类型(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++函数参数匹配规则的更多相关文章
- Python函数参数与参数解构
1 Python中的函数 函数,从数学的角度来讲是,输入一个参数,经过一个表达式的处理后得到一个结果的输出,即就是x-->y的一个映射.同样,在Python或者任何编程语言中,函数其实就是实现一 ...
- python函数的参数匹配
版本:一般用python2.7.6 python3.4.3会标注 1.不可变对象(整数.字符串)通过对象引用进行传递,在函数内部不可改变. >>> def f(a): ... a=1 ...
- Nginx日志参数、location匹配规则、设置密码
1.三个参数 a)$http_referer:记录此次请求是从哪个链接访问过来的: 是直接访问,还是从其他网站跳转过来的. 例如:访问:http://www.etiantian.com/,其页面首页是 ...
- python基础(三元运算+深浅拷贝+函数参数)
三元运算 三元运算,又称三目运算,主要作用是减少代码量,是对简单的条件语句的缩写. 书写格式: result = 值1 if 条件 else 值2 即如果条件成立,则将值1赋给result变量,如果不 ...
- Django中url匹配规则的补充
Django中url匹配规则是在urls.py文件中配置的. 1.关于正则匹配优先级 在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条. 在url匹配列表中,如果第一条为正则模 ...
- Python函数的作用域规则和闭包
作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器 ...
- 二十一、springboot之定制URL匹配规则(项目中遇到的问题:get方式传参,带有小数点,被忽略)
一.问题描述: get方式传参,在传送价格,积分时(带有小数点),debug后台微服务接受到的参数,却不带小数点,如:price是0.55,后台接受后却是0 二.解决 在WebConfiguratio ...
- SQLite 自定义函数,聚合,排序规则
SQLite 自定义函数,聚合,排序规则 1.使用自定义函数, 聚合以及排序规则的基本方法是使用回调函数.这些注册的函数的生命周期只存在于应用程序中, 并不存储在数据库文件中, 因此需要在每个连接建立 ...
- JS中给函数参数添加默认值(多看课程)
JS中给函数参数添加默认值(多看课程) 一.总结 一句话总结:咋函数里面是可以很方便的获取调用函数的参数的,做个判断就好,应该有简便方法,看课程. 二.JS中给函数参数添加默认值 最近在Codewar ...
- Go的http包中默认路由匹配规则
# 一.执行流程 首先我们构建一个简单http server: ```go package main import ( "log" "net/http" ) f ...
随机推荐
- 2022-02-15:扫地机器人。 房间(用格栅表示)中有一个扫地机器人。 格栅中的每一个格子有空和障碍物两种可能。 扫地机器人提供4个API,可以向前进,向左转或者向右转。每次转弯90度。 当扫地机
2022-02-15:扫地机器人. 房间(用格栅表示)中有一个扫地机器人. 格栅中的每一个格子有空和障碍物两种可能. 扫地机器人提供4个API,可以向前进,向左转或者向右转.每次转弯90度. 当扫地机 ...
- transaction.atomic装饰器
from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic imp ...
- Windows server 2012 安装ad域
Windows server 2012 安装ad域 安装ad域(active directory)服务的作用:存储目录数据并管理域之间的通信,包括用户登录处理,身份验证和目录搜索等. 1.使用ad ...
- WARNING: The repository located at mirrors.aliyun.com is not a trusted or secure host and is being
更换下载源: https://pypi.tuna.tsinghua.edu.cn/simple/
- Kubernetes 研究笔记
Kubernetes 研究笔记 在接下来的这篇笔记中,我将会介绍 Kubernetes 这一强大的容器编排工具,并学习其基本使用方法.该笔记将会被存储在https://github.com/owlma ...
- AI 协助办公 |记一次用 GPT-4 写一个消息同步 App
GPT-4 最近风头正劲,作为 NebulaGraph 的研发人员的我自然是跟进新技术步伐.恰好,现在有一个将 Slack channel 消息同步到其他 IM 的需求,看看 GPT-4 能不能帮我完 ...
- JS引擎中的线程,事件循环,上下文
线程 浏览器中有哪些进程呢? 1.浏览器进程:浏览器的主进程,负责浏览器的界面界面显示,与用户交互,网址栏输入.前进.后退,以及页面的创建和销毁. 2.渲染进程(浏览器内核):默认一个tab页面一 ...
- Custom directive is missing corresponding SSR transform and will be ignored
背景 最近在给业务组件库集成指令库,将各个项目中常用的指令如一键复制.元素和弹窗拖拽等封装到一起,进行统一发版维护. 业务组件库项目架构采用的是pnpm+vite+vue3+vitepress,其中v ...
- A First course in FEM —— matlab代码实现求解传热问题(稳态)
这篇文章会将FEM全流程走一遍,包括网格.矩阵组装.求解.后处理.内容是大三时的大作业,今天拿出来回顾下. 1. 问题简介 涡轮机叶片需要冷却以提高涡轮的性能和涡轮叶片的寿命.我们现在考虑一个如上图所 ...
- Winform或WebForm使用ReportViewer报表设计,工具栏按钮英文显示的解决办法
在项目开发中,我们总是会用到rdlc报表设计器,大多数情况下在本地开发环境中工具栏按钮显示的是中文,但是部署到客户环境后发现显示的是英文. 解决这个问题也是走了很多弯路,给大家简单说一下: 1.最初以 ...