#include <iostream>
using namespace std;
int main()
{
// Case 1
cout << &5; // This line fails to compile. Ok, I get this because "5" is a rvalue.
// Case 2
const int& ref = 5;
cout << &ref; // Works fine. Why?
// Case 3
cout << &"SomeString"; // Works fine. Ok, I get this because "SomeString" is a lvalue
return 0;
}
Por que o caso 1 falha e o caso 2 passa? Não consegui encontrar explicação concreta em nenhum outro lugar. A maioria das respostas era confusa e autocontraditória.
Eu entendo que "5" em literal inteiro e é um rvalue (não podemos pegar o endereço dele). Então, o que de especial uma referência const lvalue no caso 2 faz, que permite pegar o endereço de "5"? Como eu li, uma referência (seja lvalue ou rvalue) é apenas um alias. Ela não tem endereço próprio.
Uma referência de lvalue não constante não pode ser vinculada a um temporário ou a um literal, e você não pode obter o endereço de um literal ou de um temporário.
referências const lvalue têm extensão de tempo de vida quando se vinculam a um temporário ou literal, basicamente
É interpretado pelo compilador como
Você está obtendo o endereço do objeto cujo tempo de vida foi estendido pelo compilador.
foo
Observe que a extensão de tempo de vida nem sempre se aplica, veja Por que uma referência const não estende a vida de um objeto temporário passado por uma função?, há algumas regras para quando a extensão de tempo de vida se aplica. (Você precisa que o rhs seja um temporário ou um literal, não uma referência a um, não uma referência rvalue)
Literais de string são diferentes, veja a referência C++ de um literal de string , é semelhante à extensão de tempo de vida que você pode pegar seus endereços, eles são armazenados na memória estática de qualquer maneira, eles não são temporários, eles existem além do escopo da função.