>>947
最適化を考慮しなければ
呼び出し元のf()の位置にはstrとは別の一時オブジェクトがコピーで作られるので
f()から戻ってきた時点でstrは消えてる

ただコンパイラは最適化して一時オブジェクトを介さないようにしてもよく
今の場合最大限最適化されればstr2の位置に直接オブジェクトを構築する可能性もある
つまり
int main()
{
std::string str2="ハロ 今日も元気だね";
}
のようにする場合さえある

参考
https://ideone.com/meJdTX