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.

questionAnswers(2)

yourAnswerToTheQuestion