«Универсальная ссылка» (стандартным термином является ссылка на пересылку ) является (по определению) ссылкой rval на параметр cv-unqualified template, то есть T&&
.
Vector<Size, TypeT>&&
является ссылкой на rvalue, а не ссылкой на пересылку.
Если вы хотите получить значение аргументов шаблона, напишите признак:
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;
};
И проверьте std::decay_t<T>
:
template<class T>
void foo(T&& t) {
using TypeT = typename vector_traits<std::decay_t<T>>::value_type;
// use TypeT.
}
Вы также можете переместить его в аргумент шаблона по умолчанию, что делает foo
SFINAE-friendly (он удаляется из набора перегрузки, если std::decay_t<T>
не является «вектором» "):
template<class T,
class TypeT = typename vector_traits<std::decay_t<T>>::value_type>
void foo(T&& t) {
// use TypeT.
}