RVO (Return Value Optimization) と NRVO (Named Return Value Optimization) について読みました。以下に 2 つの例を示します
//Example of RVO
Bar Foo()
{
return Bar();
}
//Example of NVRO
Bar Foo()
{
Bar bar;
return bar;
}
それは理にかなっており、優れたコンパイラの最適化です。ただし、Stanley Lippman の「C++ 入門書」から、「ローカル オブジェクトへの参照またはポインターを返さない」(ch 6.3.2) を読みました。コード例は次のとおりです。
//disaster: this function returns a reference to a local object
const string &manip()
{
string ret;
// transform ret in some way
if (!ret.empty())
return ret; // WRONG: returning a reference to a local object!
else
return "Empty"; // WRONG: "Empty" is a local temporary string
}
わかりません。この例は RVO の例とどこか違うのでしょうか? それらが同じである場合、呼び出しスタックの巻き戻しによる未定義の動作を引き起こす代わりに、コンパイラーが RVO 最適化を行うようにするにはどうすればよいでしょうか?