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

about returning a const reference to a temporary argument

本文关键字:参数 const 引用 于返回 返回      更新时间:2023-10-16

我在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引用绑定到匿名临时对象会将该匿名临时对象的生存期延长到该const引用的生存期。

但是,尝试在foo中重新绑定返回的对a的引用将不会延长生存期:生存期扩展不是可传递的。所以amain()中的一个悬空引用。