2015-11-23 2 views
2

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

В выше я следующий вопрос

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

* Что делает автор означает «если вызывающий абонент ... * -' f (w) ' – Amit

+0

Термин позднее был изменен на [Справочная информация пересылки] (https://isocpp.org/files/papers/N4164.pdf) –

+0

@ amit есть разница в вычете типа, если пользователь задает тип – venkysmarty

ответ

1

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

f<Widget>(w); 
Смежные вопросы