8. 函数探幽

函数模板

隐式实例化、显式实例化和显式具体化统称为具体化(specialization)。它们的相同之处在于,它们表示的都是使用具体类型的函数定义,而不是通用描述。

引入显式实例化后,必须使用新的语法一在声明中使用前缀template和template<>,以区分显式实例化和显式具体化。通常,功能越多,语法规则也越多。下面的代码片段总结了这些概念:

img

然而,有时候,即使两个函数都完全匹配,仍可完成重载解析。首先,指向非cost数据的指针和引用优先与非const指针和引用参数匹配。也就是说,在recycle()示例中,如果只定义了函数#3和#4是完全匹配的,则将选择#3,因为ink没有被声明为const。.然而,const和非const之间的区别只适用于指针和引用指向的数据。也就是说,如果只定义了#1和#2,则将出现二义性错误。

img

简而言之,重载解析将寻找最匹配的函数。如果只存在一个这样的函数,则选择它:如果存在多个这样的函数,但其中只有一个是非模板函数,则选择该函数:如果存在多个适合的函数,且它们都为模板函数,但其中有一个函数比其他函数更具体,则选择该函数。如果有多个同样合适的非模板函数或模板函数,但没有一个函数比其他函数更具体,则函数调用将是不确定的,因此是错误的:当然,如果不存在匹配的函数,则也是错误

2.关键字decltype(C++11)

C++11新增的关键字decltype提供了解决方案。可这样使用该关键字:

int x;

decltype(x) y;//make y the same type as x

C++新增了一种声明和定义函数的语法。下面使用内置类型来说明这种语法的工作原理。对于下面的原型:

img
img

8. 函数探幽
http://binbo-zappy.github.io/2024/11/27/cpp-primer-plus/8-函数探幽/
作者
Binbo
发布于
2024年11月27日
许可协议