Home > Back-end >  How are templates work so that the classes are properly generated by the compiler to work with both
How are templates work so that the classes are properly generated by the compiler to work with both

Time:08-04

Given

int i = 42;
int* p = &i;

we cannot do

const int * & d = p;

In my current understanding, this is because const int * & d can be read as "d is a reference of a pointer to an int that is a const" and p is "a pointer to an int", which means the RHS needs to be turned into a temporary being "a pointer to an int that is a const" and that cannot be binded directly with a reference (as on the LHS). We would need to have, say, const int* const& d = p;. Possible references: 1, 2.

That said, consider the following toy code:

template<typename T>
class X
{
public:
    void fun(const T& d) {  }
};

At first, I thought if I do

X<int*> x;
x.fun(p);

The method generated by the compiler would be void fun(const int*& d), and I would get an error due to the above reason.

However, there is no error and it works "as expected" (by that I mean, we always have d itself as the const no matter T is replaced by pointer types or by non-pointer types).

My current guess is that, for the above scenario, the method generated by the compiler is something like void fun(int* const& d).

May I ask if my guess is correct? How are templates work so that the classes generated by the compiler work with pointers "as expected"?

CodePudding user response:

Your guess is correct.

For const T, const is qualified on type T directly. Given T is int* (non-const pointer to non-const int), const T results in const pointer, i.e. int* const (const pointer to non-const int) but not const int* (non-const pointer to const int).

  • Related