Подтвердить что ты не робот

Есть ли разница между универсальными ссылками и ссылками на пересылку?

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

void f(int && i);

Однако аргумент этой функции будет привязан к значению rvalue или lvalue:

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

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

4b9b3361

Ответ 1

Они имеют в виду одно и то же?

Универсальная ссылка была термином Скотт Майерс, придуманным, чтобы описать концепцию получения ссылки rvalue на неквалифицированный шаблонный параметр, который затем можно вывести как значение или ссылку на значение lvalue.

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

Ссылка на пересылку представляет собой ссылку rvalue на параметр cv-unqualified template. Если P является ссылкой для пересылки, а аргумент - значением l, тип "lvalue reference to A" используется вместо A для вывода типа.

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

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

Нет, то, что вы делаете с ссылкой пересылки, не имеет значения для имени. Ссылка на пересылку концепции просто означает, что тип T выводится в:

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

Его не нужно пересылать впоследствии.

Ответ 2

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