Универсальная ссылка для ошибки типа шаблона
Извините за плохое название...
Итак, обычно в такой функции:
template <class T>
void f(T&& i){
}
T&&
это универсальная ссылка. В таком контексте это rvalue-ссылка:
template <class T>
struct s{
void f(T&& t){}
};
Это имеет смысл, так как T
является фиксированным типом относительно s
из которых f()
это метод.
Однако, по-видимому, в этом контексте:
template <class T, unsigned n>
std::array<T, n>
f(T&&){
}
T&&
также является rvalue-ссылкой. Этот случай отличается от приведенного выше. Итак, в чем причина T&&
быть здесь не только универсальным, но и ссылочным значением?
1 ответ
Это потому, что вы указали тип параметра в явном виде (я предполагаю, что это очень много, но это единственный способ заставить ваш пример компилироваться).
f<int,5>
не выполняет никаких типов выводов, и его параметр int&&
, Там нет ссылки рушится происходит.
Вы можете обойти это, написав f
Шаблон как таковой:
template<unsigned n, typename T>
array<decay_t<T>, n>
f(T&& t);
Сейчас, t
является переадресацией / универсальной ссылкой, если вы не предоставите второй аргумент шаблона явно.