命名返回值省略
如果從函式返回左值表示式 ,則該左值:
- 表示該函式的區域性自動變數,它將在
return
之後被銷燬 - 自動變數不是函式引數
- 並且變數的型別與函式的返回型別的型別相同
如果所有這些都是這種情況,那麼可以省略從左值的複製/移動:
std::string func()
{
std::string str("foo");
//Do stuff
return str;
}
更復雜的案例有資格獲得 elision,但案例越複雜,編譯器實際上將其刪除的可能性就越小:
std::string func()
{
std::string ret("foo");
if(some_condition)
{
return "bar";
}
return ret;
}
編譯器仍然可以忽略 ret
,但是他們這樣做的可能性會下降。
如前所述,不允許使用 elision 作為值引數。
std::string func(std::string str)
{
str.assign("foo");
//Do stuff
return str; //No elision possible
}