命名返回值省略

如果從函式返回左值表示式 ,則該左值:

  • 表示該函式的區域性自動變數,它將在 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
}