В старой версии (в основном) произвольный T введен только для того, чтобы обойти проблему, которая
const int *p=0;
auto q=reinterpret_cast<char*>(p); // error: casts away constness
меняется с int
на char
. Это эффективно переписано как
auto __q=reinterpret_cast<const char*>(p); // ok
char *q=__q; // error
Более новая версия просто явно использует U1 вместо изобретения T .