写在前头:本篇提问简答,下篇详细讲解本质~
一、问题: 程序打印输出是怎样的
#include <iostream>
using namespace std;
#define MYTRACE() do { cout << __FUNCTION__ << ","<< __LINE__ << endl; }while(0);
template<typename T>
void UNUSED(const T& t) {void(t);}
template<typename T, typename... Args>
void UNUSED(const T& t, const Args&... args)
{
void(args...);
}
template<typename T>
auto f(T x)->decltype(x*2)
{
MYTRACE();
return x*2;
}
// 函数模板的全特化
template<>
auto f<int>(int x)->decltype(x*2)
{
MYTRACE();
return x*2;
}
int main(int argc, char *argv[])
{
UNUSED(argc,argv);
cout << f(2) << " " <<f(3.4) << endl;
return 0;
}
【思考】
如上一段代码, 打印输出的内容会是什么?
二、简答
【答案】打印输出如下“
f,19
f,27
4 6.8
对于重载函数的匹配调用规则,我想大家肯定都比较熟悉了,在main
中调用 f(2)
的返回值是4
,调用f(3.4)
的结果是6.8
;
我们在这里考虑的问题是,为什么函数调用的顺序是先 f(3.4)
再调用 f(2)
;