Inicialización de referencia y enlace directo vs indirecto
Considere el siguiente caso
struct A {
operator int();
};
int &&x = A();
La especificación dice enhttp://eel.is/c++draft/dcl.init.ref#5 sobre si el enlace de referencia es directo o indirecto
En todos los casos, excepto el último (es decir, crear e inicializar un temporal desde la expresión inicializadora), se dice que la referencia se une directamente a la expresión inicializadora.
El caso anterior no coincide con el último, pero el segundo último punto.
Si T1 o T2 es un tipo de clase y T1 no está relacionado con la referencia a T2, se consideran las conversiones definidas por el usuario ... El resultado de la llamada a la función de conversión, como se describe para la inicialización de copia sin referencia, es entonces se usa para inicializar directamente la referencia.
Por lo tanto, la unión deA()
a la referencia esenlace indirecto. Para continuar, volveremos a la inicialización de referencia nuevamente, ahora con un valor de tipoint
, tratando de inicializarint&&
. Ahora terminaremos con la última viñeta, lo que significaenlace directo.
Entonces, ¿qué podemos decir sobre la vinculación de la referencia ... se vincula directa o indirectamente? ¿Hace ambas cosas, dependiendo de la expresión que considere (expresión inicializadora versus resultado de la llamada a la función de conversión)?
En nuestro caso en particular, los párrafos parecen decirnos unimos directamente a la expresión inicializadora y nos vinculamos indirectamente al resultado de la conversión en la expresión inicializadora. Sin embargo, en el capítulo sobre resultado de sobrecargahttp://eel.is/c++draft/over.ics.ref, solo distinguimos entre
Cuando un parámetro de tipo de referencia se une directamente ([dcl.init.ref]) a una expresión de argumento,Si el parámetro se une directamente al resultado de aplicar una función de conversión a la expresión del argumento,Cuando un parámetro de tipo de referencia no está vinculado directamente a una expresión de argumento,Para un caso como
void f(int &&);
f(A());
Se aplica el caso 1, pero estoy bastante seguro de que no está destinado a aplicarse. Mi intuición es que "En todos los casos, excepto el último", no solo se pretende que coincida con la creación del caso temporal, sino también con la segunda última viñeta o, alternativamente, con toda la rama "De lo contrario:" que contiene las dos viñetas (es decir, el "último" se refiere a un nivel diferente en la jerarquía de viñetas). ¿Puedes por favor aclarar?