第二个Const参考可以延长临时

时间:2017-05-20 18:38:46

标签: c++ temporary-objects const-reference prvalue

  • 背景:

我注意到std :: max的签名是:

模板< typename T>
const T& max(const T&,const T&);

我想知道返回对const的引用的含义 的...

如果我们传入两个L值,那么我们可以返回一个引用 两个中的一个。但是如果我们传入两个PR值,那么返回的是什么 使用它是否安全?

问题:

我和一些同事谈过,这是一个很小的工作实例 问题:http://cpp.sh/4en4

#include <iostream>
int glob = 100;
class temp{
  int* val;
public:
  temp(int n = 0){
    val = new int(n);
  }
  void print() const{ std::cout << "I store " << *val << std::endl; }
  ~temp(){
    std::cout << "temp object died" << std::endl;
    delete val;
    val = &glob;
  }
};
const temp& foo(const temp& a){
  return a;    
}

int main(){
  const temp& b = foo(2); 
  std::cout << "Is it safe?" << std::endl;
  b.print(); 
}

没有优化:

temp object died
Is it safe?
I store 100

温和:

temp object died
Is it safe?
I store -1992206527

使用不同级别的优化运行此功能会有所不同 结果。但是,在所有情况下,似乎返回引用都可以 不延长本地物体的寿命;它的结构仍然是 虽然在一个案例中,我们似乎恢复了对它的引用 在另一方面,我们似乎有一个悬垂的指针。

标准:

引用C ++标准,文件号N4618:

  

12.2第6项:

     

...当引用绑定到临时引用时。临时的   参考是   绑定或临时,它是子对象的完整对象   引用仍然存在   在参考文件的生命周期中除外:
  (6.1) - 绑定到函数中引用参数的临时对象   呼叫(5.2.2)持续到完成   包含调用的完整表达式。
  (6.2) - 临时绑定到返回值的生命周期   函数返回语句(6.6.3)不是   扩展;临时在完整表达结束时被销毁   退货声明。&#34;

从(6.1)开始,它似乎应该存在一个临时的foo(2) 声明初始化b。

从(6.2)开始,似乎是当地的&#39; a&#39;被摧毁,哪个 实际上是破坏了临时foo(2),导致b接受了 毁灭价值。

我的问题:

1a上。什么是包含临时生成的完整表达式 foo(2)

中的const temp& b = foo(2);

1b中。第二个const引用可以延长临时的生命周期吗?

  1. 为什么std :: max实现这样,鉴于明显的危险?

0 个答案:

没有答案