引用函数

时间:2016-10-17 19:19:07

标签: c++ reference return-value stackframe

我很困惑是否保证以下代码段foo有效,即是否允许将函数返回值存储为const引用?

我问,因为返回值存储在堆栈帧中,在返回值后很快就会失效。

Foo getFoo() {
   return Foo();
}

void bar() {
  const auto& foo = getFoo();

  // more function calls...

  // is foo guaranteed to be valid?
}

1 个答案:

答案 0 :(得分:2)

这是有效的C ++,但要注意某些编译器(例如Visual Studio 2015,据我所知)没有正确实现

根据标准(N4140):

  

12.2临时物品
....

     

4 有两种情况,临时表现在不同点,而不是完整表达结束。第一个上下文是调用默认构造函数来初始化数组的元素。如果   构造函数有一个或多个默认参数,破坏默认情况下创建的每个临时值   在构造下一个数组元素之前,参数是按顺序排序的。

     

5 第二个上下文是引用绑定到临时的。 引用所在的临时值   绑定 或作为绑定引用的子对象的完整对象的临时 持续存在   参考的生命周期 除外:

     

(某些例外情况)