¿Hay alguna diferencia entre referencias universales y referencias de reenvío?


Un argumento para esta función se enlazará a una referencia rvalue:

void f(int && i);

Sin embargo, un argumento para esta función se enlazará a una referencia rvalue o lvalue:

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

A menudo he escuchado esto referido como una referencia universal.
También he oído que se llama una referencia de reenvío.
¿Significan lo mismo?
¿Es solo una referencia de reenvío si el cuerpo de la función llama a std::forward?

Author: Barry, 2016-09-18

2 answers

¿significan lo mismo?

Referencia universal fue un término que Scott Meyers acuñó para describir el concepto de tomar una referencia rvalue a un parámetro de plantilla CV no calificado, que luego puede deducirse como un valor o una referencia lvalue.

En ese momento el estándar de C++ no tenía un término especial para esto, que era un descuido en C++11 y hace que sea difícil de enseñar. Esta omisión fue remediada por N4164 , que agregó la siguiendo la definición de [temp.deducir]:

Una referencia de reenvío es una referencia rvalue a un parámetro de plantilla cv-unqualified. Si P es una referencia de reenvío y el argumento es un lvalue, el tipo "lvalue reference to A" se usa en lugar de A para la deducción de tipo.

Por lo tanto, los dos significan lo mismo, y el término estándar actual de C++ es referencia de reenvío. El documento en sí articula por qué "referencia de reenvío" es un término mejor que "universal reference."

¿Es solo una referencia de reenvío si el cuerpo de la función llama a std::forward?

No, lo que haces con una referencia de reenvío es irrelevante para el nombre. La referencia de reenvío de conceptos simplemente se refiere a cómo se deduce el tipo T en:

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

No es necesario remitirlo posteriormente .

 29
Author: Barry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-17 22:41:14

Desafortunadamente, es confuso, pero no son más que dos nombres para la misma cosa.
La referencia universal fue propuesta (supongo) por Meyers hace mucho tiempo (ver aquí como ejemplo).
La referencia de reenvío se obtiene directamente del standardese . Eso es todo.

 13
Author: skypjack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-17 22:32:19