c++ - una - Resolución de sobrecarga entre objeto, referencia de valor real, referencia de referencia
referencias de programacion (1)
Dadas las tres funciones, esta llamada es ambigua.
int f( int );
int f( int && );
int f( int const & );
int q = f( 3 );
La eliminación de f( int )
hace que tanto Clang como GCC prefieran la referencia rvalue sobre la referencia lvalue. Pero en su lugar, eliminar cualquiera de los resultados de sobrecarga de referencia en la ambigüedad con f( int )
.
La resolución de sobrecarga generalmente se realiza 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 defecto sobre esto.
¿Hay alguna posibilidad de que int &&
pueda ser preferido sobre int
en un estándar futuro? La referencia debe vincularse a un inicializador, mientras que el tipo de objeto no está tan limitado. Así que sobrecargar entre T
y T &&
podría significar efectivamente "usar el objeto existente si me han dado propiedad, de lo contrario hacer una copia". (Esto es similar al valor puro de paso por paso, pero ahorra la sobrecarga de movimiento.) Como estos compiladores funcionan actualmente, esto se debe hacer sobrecargando T const &
y T &&
, y copiando explícitamente. Pero ni siquiera estoy seguro de que sea estrictamente estándar.
¿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 las otras dos. Cuando se comparan dos inicializaciones, una es mejor que la otra, o ninguna es mejor (son indistinguibles).
Sin reglas especiales sobre la vinculación de referencia directa, las tres inicializaciones mencionadas serían indistinguibles (en las tres comparaciones).
Las reglas especiales sobre el enlace directo de referencia hacen que int&&
mejor que const int&
, pero ninguno es mejor o peor que int
. Por lo tanto, no hay mejor coincidencia:
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 vincula una referencia rvalue a un valor r y S2 vincula una referencia lvalor.
Pero esta regla no se aplica cuando una de las inicializaciones no es un enlace de referencia.
¿Hay alguna posibilidad de que int && pueda ser preferido sobre int en un estándar futuro? La referencia debe vincularse a un inicializador, mientras que el tipo de objeto no está tan limitado. Así que sobrecargar entre T y T && podría significar efectivamente "usar el objeto existente si me han dado propiedad, de lo contrario hacer una copia".
Usted propone hacer que una referencia de enlace sea una mejor coincidencia que una vinculación de no referencia. ¿Por qué no publicar su idea para isocpp futuras propuestas ? SO no es lo mejor para discusión / opinión subjetiva.