Универсальная ссылка для ошибки типа шаблона

Извините за плохое название...

Итак, обычно в такой функции:

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 является переадресацией / универсальной ссылкой, если вы не предоставите второй аргумент шаблона явно.

Другие вопросы по тегам