2016-11-02 7 views
0

извинить плохое название ...универсальный справочник для ошибок типа шаблона

Таким образом, как правило, в функции, как это:

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&& является ссылкой rvalue здесь, а не универсальной?

+0

можете ли вы перефразировать это? Я не понимаю, что ты говоришь. –

+0

Почему вы говорите, что 'T &&' является ссылкой на rvalue в этом случае? – 0x499602D2

ответ

3

Это потому, что вы явно указали тип параметра (я принимаю это много, но это единственный способ сделать ваш пример компиляцией).

f<int,5> не производит никаких вычетов типа, а его параметр - int&&. Не происходит свертывания ссылок.

Вы можете обойти это, написав f шаблон, как, например:

template<unsigned n, typename T> 
array<decay_t<T>, n> 
f(T&& t); 

Теперь t является пересылка/универсальный справочник , если вы не предоставите второй аргумент шаблона явно.

+0

Я вижу, да, я дал это явно. Благодарю. Будет искать эту функцию распада. –

+1

@lotolmencre 'decay_t', чтобы убедиться, что вы не закончите с' T & ', что не является юридическим типом для' std :: array' – krzaq