写在前头:本篇提问简答,下篇详细讲解本质~ 

一、问题: 程序打印输出是怎样的

#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);

01-30 23:14