以c ++ 03对11返回值

aia*_*iao 0 c++ rvalue lvalue c++11

关于rvalue和lvalue,我花了几个小时.这是我的理解

int main()
{
  //.....
  Foo foo = Bar1();
  foo = Bar2();
  //......
}  

Foo Bar1()
{
  //Do something including create foo
  return foo;
}

Foo& Bar2()
{
  //Do something including create foo
  return foo;
}
Run Code Online (Sandbox Code Playgroud)

在c ++ 03下,Bar1()将复制返回对象(就在返回之前),然后返回复制对象的地址; 执行一个即将被销毁的物品的浪费副本.Bar2()将返回在函数内创建的对象.

下C++ 11,Bar1()Bar2()将基本上相等(并且也等同于Bar2()C++ 03).

是对的吗?如果没有,请详细说明.

Jur*_*aho 6

他们不一样.Bar2()UB是两个标准.您不能通过引用返回在堆栈上创建的对象.

在C++ 03中Bar1()可以利用RVO并且不会复制任何内容.在C++ 11中,Bar1()如果不能使用RVO,它甚至会使用RVO或使用移动构造函数.