[問題] const int *& 給值的問題

看板C_and_CPP (C/C++)作者 (0n羊)時間9年前 (2016/09/30 18:21), 9年前編輯推噓2(2024)
留言26則, 6人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) G++, Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 請問各位大大,為什麼這段程式碼 compile 不過? 小弟跪求解釋 int main() { int *b = 0; const int *& n = b; } 錯誤訊息: error: invalid initialization of non-const reference of type 'const int*&' from an rvalue of type 'const int*' 我有找到這篇說是因為type-safe 的關係: http://stackoverflow.com/a/11514730 但是如果把程式改成這樣,也沒有type-safe,可是卻可以成功compile int a = 0; int *b = &a; const int & n = *b; cout << n << endl; // n = 0 *b = 3; cout << n << endl; // n = 3 又看到了這篇的回答:http://stackoverflow.com/a/31412466 但是卻也看不太懂他的回答是什麼意思,為什麼它會回傳rvalue? 還有,為什麼宣告成 const int * const & n = b 就可以compile 過? 感謝各位大大! 程式碼(Code):(請善用置底文網頁, 記得排版) http://ideone.com/W5kqRr 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.48.199 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1475230865.A.28A.html

09/30 18:24, , 1F
「指」標要指得到東西,什麼被指到。
09/30 18:24, 1F
這邊的指標指到 NULL 啊 ※ 編輯: seanooxox (220.135.48.199), 09/30/2016 18:33:47

09/30 18:48, , 2F
int* const & n = b;
09/30 18:48, 2F

09/30 18:48, , 3F
就是const修飾到什麼的問題
09/30 18:48, 3F

09/30 19:06, , 4F
const int *b = 0;
09/30 19:06, 4F

09/30 20:17, , 5F
0 在這邊就是NULL的意思啊,而且就算換成其他東西也會
09/30 20:17, 5F

09/30 20:17, , 6F
有一樣的錯誤
09/30 20:17, 6F

09/30 20:36, , 7F
可以嘗試全篇翻英丟上,語法解法已給。問題本身不明確。
09/30 20:36, 7F

09/30 20:57, , 8F
先感謝您的回覆,可能是我表達的不清楚。那我換個方式
09/30 20:57, 8F

09/30 20:57, , 9F
問問題好了,在我程式碼中紅色字的那一行,如果拿掉con
09/30 20:57, 9F

09/30 20:57, , 10F
st的修飾,就會變得可以compile,我想知道這個跟rvalue
09/30 20:57, 10F

09/30 20:57, , 11F
有什麼關聯
09/30 20:57, 11F

09/30 21:46, , 12F
lr以assignment hand side判定。
09/30 21:46, 12F

09/30 21:48, , 13F
只是編譯器認為指定失敗,不能,不過而已。
09/30 21:48, 13F

09/30 22:27, , 14F
就我的理解是 (const int) * & 你用一個型態指向const int
09/30 22:27, 14F

09/30 22:28, , 15F
的指標去ref一個int *本來就會跟你說型態錯誤
09/30 22:28, 15F

09/30 22:29, , 16F
你用(const int) (* const) & 可以過是因為你的pointer是
09/30 22:29, 16F

09/30 22:35, , 17F
const不可更改 ref的語意有被推導出來 等其他強者解釋 QQ
09/30 22:35, 17F

09/30 22:37, , 18F
就是const int *&是lvalue ref 他應該是a等效為b
09/30 22:37, 18F

09/30 22:38, , 19F
但a是const int, 你*b改了值 *a也會跟著改就語意矛盾
09/30 22:38, 19F

10/01 03:05, , 20F
b 會先 implicit 轉型成 const int* 的 rvalue, 而錯誤在 r
10/01 03:05, 20F

10/01 03:05, , 21F
value 只能有 const reference.
10/01 03:05, 21F

10/01 08:20, , 22F
一開始的code紅色行給你編譯過的話 你就可以做:
10/01 08:20, 22F

10/01 08:21, , 23F
const int cint; n = &cint;
10/01 08:21, 23F

10/01 08:22, , 24F
*b = 100; //改到cint惹 爆炸
10/01 08:22, 24F

10/01 08:27, , 25F
也就是 想在type的某level加上const,得要一路往上每個
10/01 08:27, 25F

10/01 08:27, , 26F
level加const。 除了top level 可以不用管
10/01 08:27, 26F
文章代碼(AID): #1NxZoHAA (C_and_CPP)
文章代碼(AID): #1NxZoHAA (C_and_CPP)