[問題] 用函數設定參照的問題

作者: 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