[问题] 用函数设定参照的问题

楼主: amamoimi (佛仔)   2023-11-11 20:31:27
各位晚安打扰了
https://onlinegdb.com/_DyNuxd2H
我一直不太明白为什么为什么这样写是合法的
f(a)=5这行不是在把function call设值吗
但是照理来说只能assign value给变量吧?(gpt这样跟我讲的,但是他又说我的例子不是
设值给f(a)@@)
不好意思我好像越问越基本了...谢谢大家
作者: nh60211as   2023-11-11 20:41:00
int assign to int reference 是合法的啊
作者: sarafciel (Cattuz)   2023-11-11 20:43:00
这是左值和右值的问题 大部分function call回传是右值你这个版本的函式是回传左值 所以可以被assign
作者: wulouise (在线上!=在电脑前)   2023-11-11 20:58:00
你只是写了a=5啊你是说设值给std::function?通常是不行的
楼主: amamoimi (佛仔)   2023-11-11 21:28:00
请问为什么这个例子中回传是左值呀?回w大 是的 我是指f(a)=5这一行
作者: Lipraxde (Lipraxde)   2023-11-11 22:28:00
这并不是给 function call 设值,是做完 function call对 return value 设值,而这个 function return 的是int&,所以式子是合法的
楼主: amamoimi (佛仔)   2023-11-12 07:19:00
是只有return value是参照的情况下才能设值吗?为什么呢?
作者: wulouise (在线上!=在电脑前)   2023-11-12 10:19:00
你是设给returned ref而不是function 不要搞混了,f(a)是呼叫function f并取得回传的ref给function设值是f = xxx,但是要看你想做什么
作者: sarafciel (Cattuz)   2023-11-12 10:34:00
为什么回传的是左值这个问题的答案在左值的定义中就能找到你会这样问就代表你其实不懂什么是左值 或者不懂什么东西会被分在左值 左右值的概念在网络上资源很多 你最好找几篇文章看一下 或是翻板上以前的文章也行 不然你大概会继续用很破碎的方式去理解
楼主: amamoimi (佛仔)   2023-11-12 10:56:00
好的 谢谢您
作者: Lipraxde (Lipraxde)   2023-11-12 11:25:00
恩...我前面的讲法不太好,不要太纠结他是 return value。一行程式码不见得只做一件事,他可以有很多步骤,举例来说 a = b * c + d:1. b * c,2. b * c 的结果加上 d,3. assign b * c + d 的结果给 a不论是 = 左边还是右边都要分步骤做,然后要注意 a. 动作、b. type
楼主: amamoimi (佛仔)   2023-11-12 11:45:00
谢谢L大想问一下那为什么当传回值是指标的时候f()也不能当左值呢 指标在内存中有确切的位置,应该是可以当作左值的不是吗
作者: sarafciel (Cattuz)   2023-11-12 12:13:00
指标指到的东西是左值 不代表指标本身会是左值https://godbolt.org/z/68M1Wxjx1
楼主: amamoimi (佛仔)   2023-11-12 12:33:00
喔喔了解了 谢谢有些东西搞混了 感谢各位
作者: qwerasdf6102 (eat_centrum)   2023-11-14 13:36:00
这里提供另一个角度 即使不用左值右值的概念 你可以把所有参照都想成该变量的指标当一个变量是参照时 你把她换成是原变量的指标 然后使用时加上*取值实际上编译器就是把参照编译成指标所以你可以改成 int *f(int *)然后使用时 *f(a)=0实际上是一模一样的东西其实参照就是指标的语法糖而已 我觉得要搞清楚这点再去学左值右值的概念
作者: wulouise (在线上!=在电脑前)   2023-11-14 15:16:00
c++ declaration用法跟其他地方用法不一样很容易搞混
楼主: amamoimi (佛仔)   2023-11-14 16:35:00
请问q大的意思是这样吗int* f(int* );int main(){int a=1;int* p=&a;*f(p)=5;cout<<a;return 0;}int* f(int* x){return x;}请问编译器把参照编译成指标是什么意思呀
作者: Lipraxde (Lipraxde)   2023-11-14 20:11:00
C 的世界里是只有 pointer 的,到了 C++ 虽然多了 reference,但其实底层实现本质上还是个 pointer,只是多了些语法上的方便性。像是用 reference 的好处是写的时候不用加 * 去存取 value,并且一定 reference 的到值,不需要去检查 nullptr (毕竟要有 object 你才拿得到 reference 嘛)。前面 qwer 讲的理解方式适合从 C 入门 C++ 的人去理解reference,不过如果直接就学 C++ 的话,没必要这样转一手去理解,关注在 "type" 本身就好至于左值、右值嘛...其实也不是说一定要搞懂吧,反正记着想确保是用 move 的时候用 std::move,想 forward 参数就用 std::forward,就像不会微积分也能在菜市场买菜一样,搞不清楚左值右值还是能写 code
作者: qwerasdf6102 (eat_centrum)   2023-11-14 22:58:00
其实我当年也是从c++直接开始的啦 只是学完取值取址之后 对于ref 还是有点迷惑 直到认知到他就是指标之后才豁然开朗。 实际上我常常去看什么code会编译出什么组语, ref 跟pointer 会编译出一模一样的东西回原po 编译成指标的意思 就是他们底层实现的原理相同 本质上你写语言其实都是在对硬件做一些操作而指标与参照做的操作是一样的
楼主: amamoimi (佛仔)   2023-11-15 07:47:00
好的 感谢L大和q大!

Links booklink

Contact Us: admin [ a t ] ucptt.com