23

Аргумент этой функции будет связываться с ссылкой RValue:Есть ли разница между универсальными ссылками и ссылками на пересылку?

void f(int && i); 

Однако аргумент этой функции будет связываться либо с RValue или Lvalue справки:

template <typename T> 
void f(T && t); 

Я часто имею слышал, что это называется универсальной ссылкой.
Я также слышал, что это называется ссылкой для пересылки.
Означают ли они одно и то же?
Является ли это только ссылкой пересылки, если тело функции вызывает std::forward?

+1

См. Https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers для получения некоторого исходного материала. –

+1

@SamVarshavchik Вы действительно читали вопрос или этот блог? – Barry

ответ

25

Означают ли они то же самое?

Universal reference был термин Скотт Мейерс придуман для описания концепции принятия ссылки RValue на CV-неквалифицированным параметр шаблона, который затем можно вывести либо в виде значения или именующая ссылка.

В то время, когда стандарт C++ не имел специального термина для этого, что было надзором на C++ 11 и затрудняет его обучение. Это упущение было исправлено путем N4164, который добавил следующее определение в [temp.deduct]:

Ссылка пересылки является ссылкой на Rvalue к CV-неквалифицированным параметру шаблона. Если P является ссылкой для пересылки, а аргумент является значением l, то вместо значения типа A для типа используется тип «lvalue reference to A».

Следовательно, два означают одно и то же, а текущий стандартный термин С ++ пересылает ссылку. В самой статье говорится, почему «ссылка на пересылку» является лучшим термином, чем «универсальная ссылка».

Является ли это только ссылкой пересылки, если тело функции вызывает std::forward?

Нет, что вы делаете с ссылкой на пересылку, не имеет никакого отношения к названию. Упоминание экспедиторская понятие относится просто к тому, как тип T выводится в:

template <class T> void foo(T&&); // <== 

Он не должен быть впоследствии пересылаются.

+1

Хороший ответ! Есть ли у вас (нетривиальный) пример, где вы не будете ссылаться на 'std :: forward' в ссылке пересылки? Вы также можете указать «auto &&» для локальных переменных. – vsoftco

+1

@vsoftco 'template void foo (F && arg) {use (arg); use_again (Arg); потреблять (std: forward (arg)); } ' – Barry

+0

Само собой разумеется, спасибо, хотя у вас все еще есть переадресация :) – vsoftco

9

К сожалению, это сбивает с толку, но это не более двух имен для одного и того же.
Универсальная ссылка была предложена (я думаю) Мейерсом далеко назад (см. Пример here).
Ссылка для пересылки взята непосредственно с standardese. Это все.

 Смежные вопросы

  • Нет связанных вопросов^_^