универсальные типы дедукции Скотт Мейерс

Я читаю Эффективный современный 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.

Вверху у меня следующий вопрос

  1. Что автор имеет в виду под «если вызывающая сторона явно не укажет это, крайний случай, который мы не будем касаться»? Запрос на предоставление примера, что автор крайнего случая упоминает, что вызывающий явно указывает

2

Решение

Автор ссылается на конечного пользователя, явно указывающего параметр типа в вызове f:

f<Widget>(w);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]