将函数的返回值赋给参考c ++?

Edd*_*223 16 c++ return reference

这是一个两部分问题.可以将函数的返回值赋给引用吗?如

Foo FuncBar()
{
    return Foo();
}

// some where else
Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)

这个可以吗?我的理解是FuncBar()返回一个Foo对象,现在myFoo是对它的引用.

问题的第二部分.这是优化吗?因此,如果你在一个循环中这样做很多时候做得更好

Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)

要么

Foo myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)

并且考虑到变量的使用,不会使用ref需要更慢的解引用?

Alo*_*ave 22

Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)

不会编译.它应该是:

const Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)

因为FuncBar()返回一个临时对象(即rvalue),只有lvalues可以绑定到对非const的引用.

安全吗?

是的,这是安全的.

C++标准规定将临时对象绑定到const的引用会延长临时对象到引用本身生命周期的生命周期,从而避免了常见的悬空引用错误.


Foo myFoo = FuncBar();      
Run Code Online (Sandbox Code Playgroud)

复制初始化.
它创建一个由返回的对象的副本,FuncBar()然后使用该副本进行初始化myFoo.myFoo语句执行后是一个单独的对象.

const Foo &myFoo = FuncBar();
Run Code Online (Sandbox Code Playgroud)

将返回的临时值绑定FuncBar()到引用myFoo,请注意这myFoo只是返回的临时的别名而不是单独的对象.

  • @ Cheersandhth.-Alf:你太粗鲁了.如果你觉得答案不对,你可以投票.你的粗鲁并不是真的很感激,也不受欢迎. (7认同)
  • @ Cheersandhth.-Alf虽然我知道有人可以将它定义为`std :: string*const&`或者任何垃圾,我想可以安全地假设`typedef'在这里是不可能的.不,不要说,我知道假设是邪恶的.但是好的,*"不应该根据标准编译"*或类似的东西确实会更好. (4认同)
  • @Alf你能否详细解释一下你的观点,因为我并没有真正关注你.我能想到的唯一情况是`Foo&myFoo = fooBar();`是合法的是1)如果`Foo`实际上是对`const`的`typedef`,或者2)`Foo`包含一个`operator Foo&()`.这两种情况似乎都不是"一般"的情况.如果我提供了`class Foo`的空定义,则给定的代码不能用g ++编译,并且在VC++中给出了"使用非标准扩展"的警告. (4认同)
  • @ Cheersandhth.-Alf:按照标准它不应该.使用编译器扩展,它可能. (3认同)