c++ - what - ¿cuál es el valor del siguiente literal? 018
¿Los números literales son mutables o no? (1)
Naturalmente, esto no compilará:
int &z = 3; // error: invalid initialization of non-const reference ....
y esto compilará:
const int &z = 3; // OK
Ahora, considere:
const int y = 3;
int && yrr = y; // const error (as you would expect)
int && yrr = move(y); // const error (as you would expect)
Pero estas siguientes líneas se compilan para mí. Creo que no debería.
int && w = 3;
int && yrr = move(3);
void bar(int && x) {x = 10;}
bar(3);
¿No permitirían esas últimas dos líneas que se modifique el literal 3? ¿Cuál es la diferencia entre 3
y una constante? Y, por último, ¿hay algún peligro con los literales ''modificadores''?
(g ++ - 4.6 (GCC) 4.6.2 con -std=gnu++0x -Wall -Wextra
)
La referencia rvalue al literal 3
:
int && w = 3;
en realidad está vinculado a un temporal que es el resultado de evaluar la expresión 3
. No está ligado a algún literal platónico 3.
(Todas las siguientes referencias de estándares son del borrador de marzo de 2011, n3242)
3.10 / 1 "Valores y valores"
El valor de un literal como 12, 7.3e5 o true también es un prvalue
Luego, 8.5.3 "Referencias" proporciona las reglas sobre cómo se vincula una referencia al último caso, que dice:
De lo contrario, se creará e inicializará un temporal del tipo "cv1 T1" a partir de la expresión de inicialización utilizando las reglas para una inicialización de copia sin referencia (8.5). La referencia se vincula entonces a lo temporal.
y da como ejemplo algo muy cercano a lo que está en su pregunta:
double&& rrd = 2; // rrd refers to temporary with value 2.0