[问题] temporary 可以take reference 吗?

楼主: amamoimi (佛仔)   2024-04-11 20:27:08
c++新手最看了一些文章,发现一个问题,举个例子:
#include <iostream>
class A{
public:
int a=5;
int& g(){
return a;
}
A f(){
return *this;
}
};
int main()
{
A obj;
std::cout<<obj.f().g();
return 0;}
因为obj.f()的lifetime会持续到
std::cout<<obj.f().g();
这个line结束,所以g取obj.f().a的reference是ok的
但我还是觉得很疑惑,对temporary object 取reference 一般是不行的吧?
举例来说
int foo1(int a){
return a;}
int main(){
int& b=foo(5);}
如果说foo(5)会存在直到
int& b=foo(5)
这行结束,那这个code不是应该也ok吗
或是
int& foo2(int a){
return a;}
int main(){
int b=foo2(5);
std::cout<<foo2(5);}
同理这个不是也应该ok了吗..
这个是可以compile,但是不会cout出东西
把他丢去compiler explorer的话会发现foo2会直接回传0(?)
我觉得越来越不懂了,求解@@
谢谢大家
作者: jack7775kimo (阿庞)   2024-04-11 21:24:00
关键字:value categorycppreference上应该都能找到解释以上是回答第二个问题;最初那个obj.f()问题是因为RVO,所以obj.f()会拿到obj.a 不是暂时物件更正:就算compiler因没有RVO而拿到暂时物件,也无妨
作者: Dracarys (MayShowGunMore)   2024-04-11 21:46:00
1. int&可以bind到A::g中的a,因为a是lvalue2. int& b = foo1(5)违法是因为foo1(5)是prvalue (purervalue)3. foo2在C++20及以前都编得过,但是return的reference是dangle的,去印出来是未定义行为。C++23 P2266R3开始,a作为return的operand是xvalue,不能被bound to non-const lvalue reference,int&改成int&&或const int&才编得过。http://wg21.link/P2266R3
作者: wulouise (在线上!=在电脑前)   2024-04-11 22:10:00
通常guideline是永远不要这么做,比较节省维护心力
作者: Dracarys (MayShowGunMore)   2024-04-11 23:10:00
Non-const lvalue reference只能bind to lvalue不能rvalue (含xvalue、prvalue)a是不是lvalue跟obj.f()没关系,通常写一个变量名都是lvalue expression ,例外我只想得到C++23改的那个case
作者: jack7775kimo (阿庞)   2024-04-12 07:53:00
要看compiler厂商怎么实作,但一般来说你这样写会有
楼主: amamoimi (佛仔)   2024-04-12 09:57:00
不知道为什么我编辑之后推文整个乱掉了...j大的推文好像被截掉了,真的很不好意思@@
作者: jack7775kimo (阿庞)   2024-04-12 11:38:00
1)更正前述的obj.a应是obj2) 改code,意图也跟着变了;原先f是拿到obj自己,新的是拿到obj的复制体. (但这不影响有没有RVO)
作者: Dracarys (MayShowGunMore)   2024-04-12 16:30:00
Value category是expression的属性,obj.f()跟a是不同expr.所以我前面才说没关系
楼主: amamoimi (佛仔)   2024-04-12 16:59:00
那如果我说: obj.f()是temporary,那以它呼叫g()时,g会把这个temporary object 当成有名字的物件,是吗xd
作者: LPH66 (-6.2598534e+18f)   2024-04-13 14:36:00
再说一次, value category 是式子的属性, 不是物件的属性即使在不同状况下参照到同一个物件仍然可能是不同 category(因此才会有延长物件寿命的规则, 因为 category 可能变化)
作者: firejox (Tangent)   2024-04-13 23:06:00
可以先看这篇 #19gioP8j (C_and_CPP) 这样会比较好理解
楼主: amamoimi (佛仔)   2024-04-14 06:49:00
谢谢文章!我觉得我应该懂我第一个例子为什么valid了...(其实学校学的c++都还是很原始的版本,但是每次遇到问题,好像都需要用到c++11(?的观念去解决..)另外虽然value指的是expression,但是我怎么觉得有好几个地方他指的都是物件啊(或是参数、算子,总之就是一个名词(?)
作者: firejox (Tangent)   2024-04-14 19:20:00
因为要考虑到123、true等常数的情况,所以表达上用value

Links booklink

Contact Us: admin [ a t ] ucptt.com