Cv-calificaciones de prvalues (revisited)

Este es un seguimiento de miPregunta anterio, donde el consenso aparente era que el cambio en el tratamiento de las calificaciones cv de los valores fue solo un cambio bastante menor e intrascendente destinado a resolver algunas inconsistencias (por ejemplo, funciones que devuelven valores y declarados con tipos de retorno calificados por cv).

in embargo, veo otro lugar en el estándar que parece depender de los valores que tienen tipos calificados por cv: inicialización deconst referencias con valores a través de conversión de materialización temporal. La redacción relevante se puede encontrar en múltiples puntos en 9.3.3 / 5

[...] Si el inicializador convertido es un prvalue, su tipo T4 se ajusta al tipo "cv1 T4" ([conv.qual]) y se aplica la conversión de materialización temporal ([conv.rval]) [... ]

[...] De lo contrario, la expresión inicializadora se convierte implícitamente en un valor prva de tipo "cv1 T1". Se aplica la conversión de materialización temporal y la referencia está vinculada al resultado.

La intención es obviamente asegurarse de que cuando lleguemos a la @ re conversión de materialización temporal

7.3.4 Conversión de materialización temporal
1 Un valor pr de tipo T puede convertirse en un valor x de tipo T. Esta conversión inicializa un objeto temporal ([class.temporary]) de tipo T a partir del valor prvaluado al evaluar el valor prva con el objeto temporal como su objeto de resultado, y produce un xvalue que denota el objeto temporal. [...]

el tipoT que recibe como entrada incluye las calificaciones de CV requeridas.

Pero, ¿cómo sobrevive esa calificación cv a la 7.2.2 / 2 en caso de un prvalue no-class no-array?

7.2.2 Escriba
2 Si un prvalue tiene inicialmente el tipo "cv T", donde T es un tipo no calificado y sin matriz cv-no calificado, el tipo de expresión se ajusta a T antes de cualquier análisis posterior.

¿O sí?

P.ej. ¿Qué tipo de temporal obtenemos en este ejemplo

const int &r = 42;

Es el @ temporconst ¿o no? Podemos hace

const_cast<int &>(r) = 101; // Undefined or not?

sin desencadenar un comportamiento indefinido? Si no me equivoco, la intención original era obtener unaconst int temporal en tales casos. ¿Sigue siendo cierto? (Para los tipos de clase, la respuesta es clara: obtenemos unaconst temporal.)

Respuestas a la pregunta(0)

Su respuesta a la pregunta