I ever thought int is the simplest type, indeed it is much more complicated that what I imagined.... Please help me with following code. Code: #include <iostream> using std::cout; using std::endl; // calculate power template <class T> T mypower(const T& x, const int& n){ if (n==0) return 1; else return x*mypower(x,n-1); } int main() { int x=2.5; int n=5; cout << x << "^" << n << " = " << mypower(x,n) << endl; return 0; } My questions (confusions): (1) I know generally if we use reference parameters (x and n) for a function and do not change them, we shall use 'const' for them. However, if I purposely remove const, I found it is ok to use 'T& x '. However, using 'int &n' caused following error Why removing const works for template type T but not for int? I checked it also works for double type. What makes int type so special? (2) For template type T& x, if I use Code: int x =2; not problem. So, when not using const, why 'int & n' does not work, but T& x with T=int works? Please help me with these confusions.
This has nothing to do with int specifically, and everything to do with temporaries. You're passing the expression "n-1" into the second argument recursively; this expression evaluates to an rvalue temporary. Temporaries only have a value; they do not correspond to any particular location in memory. Therefore, they cannot be bound to a reference! But, because it's convenient to allow it, you can bind them to a const reference and things will work as expected. When you pass an rvalue by const reference, the behavior is essentially similar to pass-by-value, except that the constructor used will not necessarily be the copy constructor