我注意到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引用可以延长临时的生命周期吗?