Я читаю Эффективный современный 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>&&
Msgstr «Это исключает возможность того, что param является универсальной ссылкой. Param, следовательно, является ссылкой на rvalue, которую ваши компиляторы будут рады подтвердить для вас, если вы попытаетесь передать lvalue f
std::vector<int> v;
f(v); // error! can't bind lvalue to rvalue reference.
Вверху у меня следующий вопрос
Автор ссылается на конечного пользователя, явно указывающего параметр типа в вызове f
:
f<Widget>(w);
Других решений пока нет …