参考:http://bbs.csdn.net/topics/370021520
下面输出结果是多少?
#include <iostream> using namespace std; int g=0; template<typename T> int foo(T a) { static int value = ++g;
cout<<"输出:"<<a<<" "; return value; } int main() { cout<<foo<int>(3)<<foo<bool>(false)<<foo<float>(2.2f)<<foo<bool>(true)<<foo<int>(1)<<foo<char>('T');cout<<endl; return 0; }
结果是:输出:T 输出:1 输出:1 输出:2.2 输出:0 输出:3 234321
原因:1.cout操作符的递归调用和从右向左的顺序。 即:比如在 cout<<参数1<<参数2<<.... cout的参数入栈的顺序是参数2、参数1。在入栈之前(return值入栈前,先把相应的函数执行),这也是先打印出 输出:T 的原因
2.模板中:foo(bool) foo(int ) foo(char) 属于不同函数,有自己的函数栈地址
3.局部static(在函数内),只进行一次初始化,保存在全局数据区,所以foo<int>(1)执行后value值为2,当下一个foo<int>(3)时,static int value = ++g初始化语句没有执行。所以value仍为2
总结:1.cout递归调用 2.模板函数的不同 3.局部static的初始化