命名返回值省略

如果从函数返回左值表达式 ,则该左值:

  • 表示该函数的局部自动变量,它将在 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
}