模板函数中使用的静态变量
我无法理解以下代码的输出:-
#include <iostream>
using namespace std;
template <typename T>
void fun(const T&x){
static int count = 0;
cout << "x = " << x << " count = " << count << endl;
++count;
return;
}
int main(){
fun(1);
fun('A');
fun(1.1);
fun(2.2);
return 0;
}
Output:-
x = 1 count = 0
x = A count = 0
x = 1.1 count = 0
x = 2.2 count = 1
如果每次调用函数时都将静态变量 count 的值重新分配为 0,那么为什么在第四次调用该函数时它会变为 1。还有一件事,我们不能直接传递“T x”而不是“ const T&x ”吗?
回答
当使用显式或推导的模板参数实例化模板时,就好像声明了一个全新的、离散的类或函数。在您的情况下,此模板最终创建了三个函数:
void fun<int>(const int &x)
void fun<char>(const char &x)
void fun<double>(const double &x)
重要的是要了解这些中的每一个都是一个单独的、独立的函数,具有自己的静态count变量。因为它是static,所以它被初始化一次,并且它的值在函数调用中被保留。这就是static变量在函数中的工作方式。
显示的代码调用前两个一次,第三次调用两次。这些是您看到的结果(对第三个函数的第二次调用static count再次增加相同)。