正在返回临时对象并绑定到常量引用
Returning temporary object and binding to const reference
可能重复:
const引用会延长临时引用的寿命吗?
我的编译器不会抱怨为常量引用分配临时引用:
string foo() {
return string("123");
};
int main() {
const string& val = foo();
printf("%sn", val.c_str());
return 0;
}
为什么?我认为从foo
返回的字符串是临时的,val可以指向生命周期结束的对象。C++标准允许这样做并延长返回对象的生存期吗?
这是一个C++特性。该代码是有效的,并且完全按照它看起来的方式执行。
通常,临时对象只会持续到它出现的完整表达式结束。然而,C++故意指定将临时对象绑定到堆栈上const的引用会将临时对象的生存期延长到引用本身的生存期,从而避免了常见的悬挂引用错误。在上面的例子中,foo()
返回的临时值一直存在到最后一个大括号。
附言:这只适用于基于堆栈的引用。它不适用于作为对象成员的引用。
全文:GotW#88:Herb Sutter的"最重要常数"候选人。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?