C++重载解析
重载解析(overloading resolution)的规则决定了编译器为一个函数调用选用哪个函数定义。一般过程如下:
- 将名称相同的函数/模板函数找到并创建候选列表
- 从中挑选参数数目正确,符合完全匹配/隐式转换规则的函数创建可行函数列表
- 存在最佳可行函数 ? 使用 : 报错
完全匹配包括形参和实参类型完全一样或无关紧要的转换,无关紧要的转换包括引用和值之间,数组到指针,函数到函数指针,加上const/volatile限定符。
特殊规则: 当形参是指针/引用时,T&/T*会优先和T&/T*匹配,其次才是const T&/T*。而若分别定义了T和const T作为形参,则将产生二义性错误。
部分排序规则(partial ordering rules)
需要较少转换的候选函数优先级更高,典型地:
template <typename T> void foo(T t);
template <typename T> void foo(T* t);
/* ... */
int a;
foo(&a);
此处foo(&a)将与第一个模板匹配,因为第二个模板多了一个int模板到形参int*的转换过程。
常见误区:数组形参
template <typename T> void foo(T a[]);
template <typename T> void foo(T * a[]);
/* ... */
int a = 1, b = 2, c = 3;
int *pd[] = {&a, &b, &c};
foo(pd);
注意这里对T * a[]的解析,是一个指向类型为T *的数组。当模板替换的时候,T * []将作为该数据的类型整体,因此不存在上述的多一个转换过程的情况。且模板2比模板1更具体,因此将选择模板2。
C++重载解析的更多相关文章
- java——重载解析、静态绑定、动态绑定
重载解析: a被声明为A类型的对象,调用method()方法时,如果有多个同名方法,参数不同,编译器将列举所用类A的method()方法和所用父类中public类型的method()方法,编译器查看这 ...
- C++ 函数重载解析策略
参考<C++ Primer Plus>(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社.C++ 使用重载解析策略来决定为函数调用使用哪一个函数定义.重载解 ...
- c#方法重载,可选参数,命名参数。
其实这里没什么可说哦,c++的语法大同小异.先看一段代码. class Program { public static void Test(int a) { Console.WriteLine(&qu ...
- c++函数重载---2
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 写在前面: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函 ...
- template_12特化与重载
1,重载函数模板f<int*>((int*)pi);//1f<int>((int*)pi);//2上面用int*替换第一个模板的T,用int来替换第二个模板的T.那么将得到两个 ...
- C++ primer(八)--内联函数 引用变量 引用传递函数参数 函数重载/模板/模板具体化
一.内联函数 常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中.编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入到计算机内存中,因此每 ...
- C++的函数重载 转
——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘 写在前面: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的) ...
- C++普通函数与模板函数以及特化函数重载的优先级问题
在面对C++模板的时候,需要十分注意,因为模板的复杂性有很多情况,所以最好学习模板的方法我个人认为就是用到就去学,用不到就尽量别去看各种奇门怪技,因为你就算看了,好不容易搞懂模板的实现内部了,包括元编 ...
- C++ 函数模板重载
函数模板可以像普通函数那样重载. C++ 编译器会从不同的候选中匹配一个并进行调用. 即使不涉及到模板,这种匹配的规则也很复杂,现在还有加上模板一起匹配. 先来个小例子: #include <i ...
随机推荐
- Iis 日志文件默认路径
Iis 日志文件默认路径: C:\WINDOWS\system32\LogFiles
- highcharts实例教程二:结合php与mysql生成饼图
上回我们分析了用highcharts结合php和mysql生成折线图的实例,这次我们以技术cto网站搜索引擎流量为例利用highcharts生成饼图. 饼图通常用在我们需要直观地显示各个部分所占的比例 ...
- 知识库总结mysql常用cmd命令
打开命令目录 打开D盘mysql目录 d: cd D:\Ampps\mysql\bin 常用操作 将mysql目录下bin目录中的mysql.exe放到C:\WINDOWS下,可以执行以下命令 连接: ...
- jquery 实现的一款超简单的图片切换功能
<html><head> <meta http-equiv="Content-Type" content="text/html; chars ...
- Leetcode: Reverse Integer 正确的思路下-要考虑代码简化
题目: Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Have ...
- Web工程软件升级之数据库升级(一)
1. 首先检查oracle数据库版本是否正确 (可以使用方法 lsinventory来实现) 2. 检查oracle连接是否成功 3. 解压升级包,放到特定目录 4. 做升级前数据备份,备份主要业务数 ...
- [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】
---恢复内容开始--- 题目链接:BZOJ - 1692 题目分析 首先,有个比较简单的贪心思路:如果当前剩余字符串的两端字母不同,就选取小的字母,这样显然是正确的. 然而若两端字母相同,我们怎么选 ...
- Extjs打开window窗口自动加载html网页
Window inherits the autoLoad config option from Panel. Note that I included all config options below ...
- 使用 HT 单片机芯片做触摸按键的试验:触摸按键实践一
使用 HT 芯片做触摸按键,可供使用的专门用途芯片主要有:HT45R35,HT45R36,HT45R38,原来还有一个 45R34 ,不知道为何停止生产了.如果仅仅是为了按键功能,选择 45R35 觉 ...
- 查看Redis信息和状态
原文转自:http://redisdoc.com/server/info.html INFO [section] 以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和 ...