Today on Slack I noticed that some people still don’t know this one, so it should be shared more widely.

template<class T> void f() { puts(__PRETTY_FUNCTION__); }

You can use this magic formula to explore what the compiler is doing to your types, either for metaprogramming purposes or just to learn more about auto , auto&& , and decltype(auto) . For example:

#define EXPLORE(expr) \ printf("decltype(" #expr ") is... "); \ f<decltype(expr)>(); int main() { auto x = 5; auto&& y = 5; decltype(auto) z = 5; EXPLORE(x); EXPLORE((x)); EXPLORE(y); EXPLORE((y)); EXPLORE(z); EXPLORE((z)); }

The MSVC (Visual Studio) equivalent of __PRETTY_FUNCTION__ is __FUNCSIG__ .

Sample GCC/EDG __PRETTY_FUNCTION__ :

decltype(x) is... void f() [with T = int] decltype((x)) is... void f() [with T = int &]

Sample Clang __PRETTY_FUNCTION__ :

decltype(x) is... void f() [T = int] decltype((x)) is... void f() [T = int &]

Sample MSVC __FUNCSIG__ :