Resolución de sobrecarga entre objeto, referencia rvalue, referencia const


Dadas las tres funciones, esta llamada es ambigua.

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );

Eliminar f( int ) hace que Clang y GCC prefieran la referencia rvalue sobre la referencia lvalue. Pero en su lugar, eliminar cualquiera de las sobrecarga de referencia resulta en ambigüedad con f( int ).

La resolución de sobrecarga generalmente se hace en términos de un orden parcial estricto, pero int parece ser equivalente a dos cosas que no son equivalentes entre sí. ¿Cuáles son las reglas aquí? Me parece recordar un informe de defectos sobre este.

¿Existe alguna posibilidad de que int && sea preferible a int en un estándar futuro? La referencia debe vincularse a un inicializador, mientras que el tipo de objeto no está tan restringido. Así que sobrecargar entre T y T && podría significar efectivamente "usar el objeto existente si se me ha dado la propiedad, de lo contrario hacer una copia."(Esto es similar al valor de paso por paso puro, pero ahorra la sobrecarga de movimiento.) Como estos compiladores trabajan actualmente, esto debe hacerse sobrecargando T const & y T &&, y copiar explícitamente. Pero ni siquiera estoy seguro de que eso sea estrictamente estándar.

Author: Potatoswatter, 2013-07-31

1 answers

¿cuáles son las reglas aquí?

Como solo hay un parámetro, la regla es que una de las tres inicializaciones de parámetros viables de ese parámetro debe ser una mejor coincidencia que ambos los otros dos. Cuando se comparan dos inicializaciones, una es mejor que la otra, o ninguna es mejor (son indistinguibles).

Sin reglas especiales sobre la referencia directa vinculante, las tres inicializaciones mencionadas serían indistinguible (en las tres comparaciones).

Las reglas especiales sobre la referencia directa vinculante hacen int&& mejor que const int&, pero ninguno es mejor o peor que int. Por lo tanto no hay mejor partido:

S1    S2
int   int&&         indistinguishable
int   const int&    indistinguishable
int&& const int&    S1 better

int&& es mejor que const int& debido a 13.3.3.2:

S1 y S2 son enlaces de referencia (8.5.3) y ninguno se refiere a un parámetro de objeto implícito de una función miembro no estática declarada sin un calificador ref, y S1 enlaza una referencia rvalue a un rvalue y S2 enlazan una referencia lvalue.

Pero esta regla no se aplica cuando una de las inicializaciones no es un enlace de referencia.

¿Existe alguna posibilidad de que se prefiera int && sobre int en un estándar futuro? La referencia debe vincularse a un inicializador, mientras que el tipo de objeto no está tan restringido. Por lo tanto, la sobrecarga entre T y T && podría significar efectivamente "usar el objeto existente si se me ha dado la propiedad, de lo contrario, hacer una copia."

Usted propone hacer que un enlace de referencia coincida mejor que un enlace sin referencia. ¿Por qué no publicar su idea en isocpp futuras propuestas. ASÍ que no es lo mejor para la discusión / opinión subjetiva.

 44
Author: Andrew Tomazos,
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
2013-07-31 05:30:34