#include <type_traits>
#include <typeinfo>
#include <cxxabi.h>
#include <memory>
#include <string>
#include <cstdlib>
#include <iostream>
template <class T>
std::string
type_name()
{
typedef typename std::remove_reference<T>::type TR;
std::unique_ptr<char, void(*)(void*)> own
(
abi::__cxa_demangle(typeid(TR).name(), nullptr,
nullptr, nullptr),
std::free
);
std::string r = own != nullptr ? own.get() : typeid(TR).name();
if (std::is_const<TR>::value)
r += " const";
if (std::is_volatile<TR>::value)
r += " volatile";
if (std::is_lvalue_reference<T>::value)
r += "&";
else if (std::is_rvalue_reference<T>::value)
r += "&&";
return r;
}
int
main()
{
char* pointer[] = {"hallo"};
char **p = pointer; // SeppJ weiss alles
std::cout << "decltype(pointer) is " << type_name<decltype(pointer)>() << '\n';
std::cout << "decltype(p) is " << type_name<decltype(p)>() << '\n';
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxjeHhhYmkuaD4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlIDxjbGFzcyBUPgpzdGQ6OnN0cmluZwp0eXBlX25hbWUoKQp7CiAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSBUUjsKICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCB2b2lkKCopKHZvaWQqKT4gb3duCiAgICAgICAgICAgKAogICAgICAgICAgICAgICAgYWJpOjpfX2N4YV9kZW1hbmdsZSh0eXBlaWQoVFIpLm5hbWUoKSwgbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpLAogICAgICAgICAgICAgICAgc3RkOjpmcmVlCiAgICAgICAgICAgKTsKICAgIHN0ZDo6c3RyaW5nIHIgPSBvd24gIT0gbnVsbHB0ciA/IG93bi5nZXQoKSA6IHR5cGVpZChUUikubmFtZSgpOwogICAgaWYgKHN0ZDo6aXNfY29uc3Q8VFI+Ojp2YWx1ZSkKICAgICAgICByICs9ICIgY29uc3QiOwogICAgaWYgKHN0ZDo6aXNfdm9sYXRpbGU8VFI+Ojp2YWx1ZSkKICAgICAgICByICs9ICIgdm9sYXRpbGUiOwogICAgaWYgKHN0ZDo6aXNfbHZhbHVlX3JlZmVyZW5jZTxUPjo6dmFsdWUpCiAgICAgICAgciArPSAiJiI7CiAgICBlbHNlIGlmIChzdGQ6OmlzX3J2YWx1ZV9yZWZlcmVuY2U8VD46OnZhbHVlKQogICAgICAgIHIgKz0gIiYmIjsKICAgIHJldHVybiByOwp9CgoKCmludAptYWluKCkKewogICAgY2hhciogcG9pbnRlcltdID0geyJoYWxsbyJ9OwogICAgY2hhciAqKnAgPSBwb2ludGVyOyAvLyBTZXBwSiB3ZWlzcyBhbGxlcwogICAgc3RkOjpjb3V0IDw8ICJkZWNsdHlwZShwb2ludGVyKSBpcyAiIDw8IHR5cGVfbmFtZTxkZWNsdHlwZShwb2ludGVyKT4oKSA8PCAnXG4nOwogICAgc3RkOjpjb3V0IDw8ICJkZWNsdHlwZShwKSBpcyAiIDw8IHR5cGVfbmFtZTxkZWNsdHlwZShwKT4oKSA8PCAnXG4nOwp9