O que acontece quando você atribui uma constante literal a uma referência rvalue?
Esta é, sem dúvida, uma questão minuciosa e principalmente motivada pela curiosidade. Suponha que tenhamos o seguinte:
int x = 5;
int&& xref = std::move(x);
std::cout << "Before assignment x: " << x << std::endl;
std::cout << "Before assignment xref: " << xref << std::endl;
xref = 10;
std::cout << "After assignment x: " << x << std::endl;
std::cout << "After assignment xref: " << xref << std::endl;
A saída conforme o esperado é:
// Before assignment x: 5
// Before assignment xref: 5
// After assignment x: 10
// After assignment xref: 10
Isso faz sentido.std::move
convertex
a um valor x e nos permite vincular sua localização de memória axref
e modifique seu conteúdo de acordo. Agora vamos dizer que temos o seguinte:
int&& xref = 5;
std::cout << "Before assignment xref: " << xref << std::endl;
xref = 10;
std::cout << "After assignment xref: " << xref << std::endl;
int x = 5;
std::cout << "After assignment x: " << x << std::endl;
A saída é intuitivamente:
// Before assignment xref: 5
// After assignment xref: 10
// After assignment x: 5
Isso faz sentido geral. Esperamos poder vincular a constante literal5
paraxref
Porque5
é um pré-valor. Também esperamos quexref
seja mutável. Esperamos ainda que o valor da constante literal5
não é modificável (como mostrado de maneira um tanto pedonal nas duas últimas linhas do snippet acima).
Então, minha pergunta é: o que exatamente está acontecendo aqui? Como o C ++ sabe não modificar o valor da constante literal5
ainda manter identidade suficiente paraxref
saber que foi alterado para10
pela atribuição. Uma nova variável está sendo criada após a atribuição axref
quando está ligado a um literal constante? Essa questão nunca surgiu no C ++ 03, pois apenas as referências const podiam ser vinculadas a rvalues.