c++ - 关于返回对临时参数的 const 引用

标签 c++ linux stack g++

我在 Ubuntu 下用 g++ 4.8.4 编译。

我不明白为什么下面的代码可以正常工作意味着总是在控制台上打印一些输出而不会崩溃。

我相信函数 foo() 被分配了一个临时对象,该对象将持续到函数 foo() 完成执行。

当然,输出参数将指向分配临时文件的堆栈上的相同地址,但我惊讶地发现每次调用 A::hello() 都可以正常工作。

我认为应该避免对该内存区域的任何访问。

我想用“valgrind”仔细检查,它也说一切正常。我尝试用 -Wstack-protector 重新编译,但没有。

你知道为什么会这样吗?我的看法是错误的,还是它只是最好避免的那些“未定义”C++ 行为之一?

 #include <iostream>     
 using namespace std;

 struct A {
    A(): a(10) { cout << "a" << endl;  }
   ~A() {cout << "bye" << endl; }
    void hello() const { cout << "hi " << a << endl; }
 };

 const A& foo(const A& a = A()) {
   return a;
 }

 int main() {
   for( int i = 0; i < 10 ; i++) {
      const A& a = foo();
      a.hello();
   }
   return 0;
 }


 Output
 'a' 
 'bye'
 'hi 10'
 'a' 
 'bye'
 'hi 10'
  ...

最佳答案

行为未定义。

const 引用绑定(bind)到匿名临时值会将匿名临时值的生命周期延长到该 const 引用的生命周期。

但尝试重新绑定(bind)对 foo 中的 a 的返回引用将不会延长生命周期:生命周期延长不是传递。所以 amain() 中的一个悬挂引用。

关于c++ - 关于返回对临时参数的 const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34419291/

相关文章:

c - Linux 中的非阻塞挂载

node.js - Node 命令仅适用于 root 权限(sudo Node )

c++ - 在作用域生存期之前调用C++析构函数

c++ - 代码只从源文件中读取第一行文本

c++ - 在 `,' token 之前应为 `;' 或 '{'(C++,无效与 windows.h)

linux - 产生中断(调用irqfd)如何在KVM虚拟机上调用中断?

c - 在 C 中使用 typedef 和指针来实现堆栈

java - 反转句子中的每个单词

c++ - VS2013列表初始化

c++ - Utf-8 转 URI 百分比编码