Читаю Эффективные современные C++ Скотта Мейерсуниверсальных типов дедукции Скотт Мейерс
Для универсальных ссылок, которые являются параметрами функции, инициализатор обеспечиваются на месте вызова.
template<typename T>
void f(T&& param); // param is a universal reference.
Widget w;
f(w)
f(std::move(w));
template<typename T>
void f(std::vector<T>&& param); // param is an rvalue reference
Для универсальности требуется дедукция типа, но этого недостаточно. Форма ссылочной декларации также должна быть правильной и что она довольно ограничена. Это должно быть точно «T&&
».
При вызове f выдается тип T
(если вызывающий не указал его явно, кейс, к которому мы не будем относиться). Но форма объявления типа param не является «T&&
», это «std::vector<T>&&
». Это исключает возможность того, что param является универсальной ссылкой. Поэтому парам является Rvalue ссылка, что-то компиляторы будут рады подтвердить для вас, если вы пытаетесь передать именующее выражение в f
std::vector<int> v;
f(v); // error! can't bind lvalue to rvalue reference.
В выше я следующий вопрос
- Что автор в виду, «если вызывающий явно не указывает это, кейс края мы не будем беспокоиться»? Просьба привести пример того, что это крайний случай автор упоминает, что вызывающий абонент явно указывает
* Что делает автор означает «если вызывающий абонент ... * -' f (w) ' –
Amit
Термин позднее был изменен на [Справочная информация пересылки] (https://isocpp.org/files/papers/N4164.pdf) –
@ amit есть разница в вычете типа, если пользователь задает тип – venkysmarty