我很困惑是否保证以下代码段foo
有效,即是否允许将函数返回值存储为const引用?
我问,因为返回值存储在堆栈帧中,在返回值后很快就会失效。
Foo getFoo() {
return Foo();
}
void bar() {
const auto& foo = getFoo();
// more function calls...
// is foo guaranteed to be valid?
}
答案 0 :(得分:2)
这是有效的C ++,但要注意某些编译器(例如Visual Studio 2015,据我所知)没有正确实现。
根据标准(N4140
):
12.2临时物品
....4 有两种情况,临时表现在不同点,而不是完整表达结束。第一个上下文是调用默认构造函数来初始化数组的元素。如果 构造函数有一个或多个默认参数,破坏默认情况下创建的每个临时值 在构造下一个数组元素之前,参数是按顺序排序的。
5 第二个上下文是引用绑定到临时的。 引用所在的临时值 绑定 或作为绑定引用的子对象的完整对象的临时 持续存在 参考的生命周期 除外:
(某些例外情况)