A "universal link" (the standard term is link forwarding) is (by definition) a rvalue link to the cv-unqualified template parameter, i.e. T&&.
Vector<Size, TypeT>&& is a rvalue reference, not a forwarding reference.
If you want to get the value of the template arguments, write the attribute:
template<class> struct vector_traits;
template<template<int, class TypeT> class Vector, int Size, typename TypeT>
struct vector_traits<Vector<Size, TypeT>>{
static constexpr int size = Size;
using value_type = TypeT;
};
And check std::decay_t<T>:
template<class T>
void foo(T&& t) {
using TypeT = typename vector_traits<std::decay_t<T>>::value_type;
}
You can also move it to the default template argument, which makes fooSFINAE-friendly (it is removed from the overload set if std::decay_t<T>it is not a "vector"):
template<class T,
class TypeT = typename vector_traits<std::decay_t<T>>::value_type>
void foo(T&& t) {
}