referencias referencia punteros por paso operadores apuntadores c++ templates perfect-forwarding universal-reference forwarding-reference

punteros - referencias c++



¿Hay alguna diferencia entre las referencias universales y las referencias de reenvío? (2)

¿Significan lo mismo?

isocpp.org/blog/2012/11/… fue un término que Scott Meyers acuñó para describir el concepto de tomar una referencia rvalue a un parámetro de plantilla no calificada cv, que se puede deducir 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. Este descuido fue remediado por N4164 , que agregó la siguiente definición a [temp.deduct] :

Una referencia de reenvío es una referencia rvalue a un parámetro de plantilla no calificada cv. Si P es una referencia de reenvío y el argumento es un lvalor, se usa el tipo "lvalue referencia a A" 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 propio documento articula por qué "reenviar referencia" es un término mejor que "referencia universal".

¿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 concepto simplemente se refiere a cómo se deduce el tipo T en:

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

No necesita ser reenviado posteriormente.

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

void f(int && i);

Sin embargo, un argumento a esta función se unirá a un valor de rvalue o una referencia de lvalue:

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

A menudo he oído que esto se refiere como una referencia universal.
También he oído que se ha llamado 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 ?


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 (vea isocpp.org/blog/2012/11/… como un ejemplo).
La referencia de reenvío se recoge directamente del standardese . Eso es todo.