Aqui está a maneira mais simples de explicar o que aconteceu:
Em main (), você criou uma string e a passou para o construtor. Essa instância de cadeia existia apenas dentro do construtor. Dentro do construtor, você designou um membro para apontar diretamente para esta instância. Quando o escopo deixou o construtor, a instância da string foi destruída e o membro apontou para um objeto de string que não existia mais. Fazer com que Sandbox.member aponte para uma referência fora de seu escopo não manterá essas instâncias externas no escopo.
Se você deseja corrigir o seu programa para exibir o comportamento desejado, faça as seguintes alterações:
int main()
{
string temp = string("four");
Sandbox sandbox(temp);
cout << sandbox.member << endl;
return 0;
}
Agora o temp ficará fora do escopo no final de main () em vez de no final do construtor. No entanto, isso é uma prática ruim. Sua variável de membro nunca deve ser uma referência a uma variável que existe fora da instância. Na prática, você nunca sabe quando essa variável ficará fora do escopo.
O que eu recomendo é definir Sandbox.member como um const string member;
Isso copiará os dados do parâmetro temporário na variável membro em vez de atribuir a variável membro como o próprio parâmetro temporário.
cout << "The answer is: " << Sandbox(string("four")).member << endl;
, seria garantido que funcionaria.