指向临时变量的引用

 c++规定指向临时变量的引用只能为常数,具体看看代码了

什么是临时变量又怎么产生的呢,可以看看一下代码

 


void f(short const & b)
{}

int _tmain(int argc, _TCHAR* argv[])
{
    
int i = 20;
    
short const & b = i;//i is not a short, so generate a short variable as a temporary variable during the convert
    i = 0;
    f(i);
//i is not a short, so generate a short variable as a temporary variable during the convert
    i = 0;
    cout 
<< i << "," << b << endl; //output : 0, 20 because b is a reference to a temporary variable
    return 0;
}

 

对于临时变量,只能用常量的引用指向之。否则下面代码将不能编译通过

void f(short & b)
{}

int _tmain(int argc, _TCHAR* argv[])
{
    
int i = 20;
    
short & b = i;// can not set a non-const referenct to temporary variable
    i = 0;
    f(i);
// can not set a non-const referenct to temporary variable
    return 0;
}

有人会问指针呢???指针无论是const或是non-const在这种情况下都会编译失败的

### 右值引用临时变量的存储位置 C++ 中的右值引用(`T&&`)本质上是对一个临时对象的引用,该临时对象通常是表达式的结果,通常生命周期较短。然而,通过右值引用,该临时对象的生命周期得以延长,与右值引用变量的生命周期一致。这种延长的机制使得右值引用可以安全地访问原本即将销毁的临时对象。 在实际存储位置上,右值引用绑定的临时变量通常存储在**栈区**中。如果右值引用的是一个常量或表达式结果(如 `10 + 20`),编译器会将该常量或表达式的结果存储在栈内存中,并让右值引用指向该栈内存位置。这种机制确保了右值引用在整个生命周期内都能安全地访问该临时对象。 例如: ```cpp int&& r = 10 + 20; // 10 + 20 是右值,r 是右值引用指向栈区中的临时变量 ``` 在此情况下,`10 + 20` 的计算结果被存储在栈区,并由 `r` 引用,其生命周期与 `r` 一致,直到 `r` 超出作用域后才会被销毁[^1]。 当右值引用绑定的是一个临时对象(如某个类的临时实例),该对象同样会被构造在栈内存中,并由右值引用指向该对象。这种机制避免了不必要的拷贝操作,提升了性能,特别是在涉及大量数据或资源管理的场景中。 例如: ```cpp std::string&& s = getTemporaryString(); // getTemporaryString() 返回一个临时字符串对象 ``` 在此情况下,`getTemporaryString()` 返回的临时对象会被构造在栈内存中,并由 `s` 引用,其生命周期延长至 `s` 超出作用域为止[^2]。 ### 右值引用与生命周期管理 右值引用的一个关键特性是它能够延长临时对象的生命周期。通常情况下,临时对象的生命周期仅限于当前表达式,但在绑定到右值引用后,其生命周期会被延长到与引用变量相同。这种行为确保了右值引用在函数返回、参数传递等场景中的安全使用。 例如: ```cpp int&& r = std::move(x); // 将 x 转换为右值引用,延长其生命周期 ``` 在此情况下,`x` 被转换为右值引用,其对应的临时对象将与 `r` 的生命周期一致,而不是在表达式结束后立即销毁[^3]。 ### 总结 右值引用绑定的临时变量通常存储在**栈区**中,其生命周期通过右值引用机制得以延长。这种机制不仅提升了性能,还允许开发者在更广泛的场景中安全地使用临时对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值