返回信息流int&& fun(int&& a) {
return a + 1;
}
int main()
{
int&& f = fun(1);
cout << f << endl;//正常打印2
f = fun(f + 1);
cout << f << endl;//打印-858993458
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #102175同步于 2022/9/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
为什么第二次打印f的时候会打印-85899
a13261759922
2022/9/23镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我机器上,
第一次是2
第二次是3
所以,这个应该是 undefined behavior。
因为你将 local variable 的引用传了出来。
这和把函数内部 local variable 的指针传出来,没啥区别。
我用的gcc, c++17
【 在 a13261759922 的大作中提到: 】
: int&& fun(int&& a) {
: return a + 1;
: }
: ...................
【 在 YiYeShu 的大作中提到: 】
: 我机器上,
: 第一次是2
: 第二次是3
: ...................
但是这不是返回一个右值引用吗?函数里局部变量的空间不是会转移给右值引用变量f吗。感觉是我哪里理解出问题了
```cpp
void testguai()
{
int x{1};
int &&rx{x + 1};
int &&rrx{static_cast<int &&>(rx)};
rrx += 1;
std::cout << rx << std::endl;
std::cout << rrx << std::endl;
}
```
你试验一下这个程序,会有一定的理解。
主要结论就是,rrx 和 rx 引用的对象拥有相同的地址。
【 在 a13261759922 的大作中提到: 】
: 但是这不是返回一个右值引用吗?函数里局部变量的空间不是会转移给右值引用变量f吗。感觉是我哪里理解出问题了
【 在 YiYeShu 的大作中提到: 】
: [md]
: ```cpp
: void testguai()
: ...................
感谢,大概明白了,是之前理解出现误区了,对右值引用接管空间的概念理解出错了。
大致总结了下,这样看来就是函数返回值为引用(无论左右值引用)的话,引用变量会直接接管其返回的空间,但是其引用的内存的生存时间将取决于函数返回值类型的内存生存时间。
```cpp
int&& rval() {
int a = 1;
return std::move(a);
}
int& lval() {
int a = 1;
return a;
}
int main()
{
int&& r = rval();//错误行为
int& l = lval(); //错误行为
int&& u = 1; //1的生存周期在作用域内均存在
return 0;
}
```
推荐一个c++教程,讲的很好:
https://www.learncpp.com/
【 在 a13261759922 的大作中提到: 】
: 感谢,大概明白了,是之前理解出现误区了,对右值引用接管空间的概念理解出错了。
: 大致总结了下,这样看来就是函数返回值为引用(无论左右值引用)的话,引用变量会直接接管其返回的空间,但是其引用的内存的生存时间将取决于函数返回值类型的内存生存时间。
: [md]
: ...................
【 在 YiYeShu 的大作中提到: 】
: 推荐一个c++教程,讲的很好:
: https://www.learncpp.com/
:
哇,感谢分享
【 在 paper777 的大作中提到: 】
: func是return ref for temp
感谢,是之前对右值引用理解出问题了,以为右值引用可以直接接管那个返回的temp空间,殊不知只是将temp的引用赋值给右值引用而已