如您所知,如果通过常量引用将右值传递给函数,那么它的生命周期就会延长。也就是说,在下面的示例中,它肯定在函数正在执行时存在ref_to_ptr。问题是,这样的值应该存在多长时间,是否允许在函数中使用它print,或者它是 UB 并取消引用潜在的垃圾指针?
#include <iostream>
using namespace std;
template <typename T> const T *ref_to_ptr(const T &x)
{
return &x;
}
void print(const int *val)
{
cout << *val << endl;
}
int main()
{
print(ref_to_ptr(42));
return 0;
}
据我了解的标准(报价):
换句话说:通常引用所引用的临时对象随着引用而死。但是,如果您将临时对象作为 ref 参数的参数传递给函数,则该临时对象的生命周期会延长到包含函数调用的整个表达式的末尾。
这意味着参数生命周期
x在行尾结束也就是说,无法访问“死”对象。
这似乎也意味着通过重写代码如下:
你仍然会得到未定义的行为,因为指向的临时对象的生命周期
ptr在第一行之后结束!我将添加一个真理标准:) - 练习。为了确认@VladD的观点,我将给出以下代码:
此代码在 VC++ 和 GCC 中的行为相同,表明临时对象在 call 之后死亡
print,但在之后立即死亡。