The decltype keyword creates a variable of the type indicated by an expression.
The following statement means “make y the same type as x,” where x is an expression:
#include <iostream>
int main()
{
int iX;
decltype(iX)y; //set type of iX for y
std::cout << "type of y: " << typeid(y).name() << '\n';
return 0;
}
Let’s show another example:
- Set to the ‘XY’ same type as dX*iY
- Set to the ‘ptrdX’ same type as &dX, i.e. double*
#include <iostream>
int main()
{
double dX;
int iY;
decltype(dX*iY) XY;
decltype(&dX) ptrdX;
std::cout << "type of XY:" << typeid(XY).name() << '\n';
std::cout << "type of ptrdX:"<< typeid(ptrdX).name()<< '\n';
return 0;
}
It’s maybe particularly useful in a generic programming (in template definitions), when the type may not be determined until a specific instantiation is made:
template<typename T1, typename T2)
void Foo(T1 t1, T2 t2)
{
decltype(T1*T1) t1_t2;
...
}
The workings of decltype are more complicated than those of auto, and the resulting
types can be references and can be const-qualified, depending on the expressions used.

