[問題] 請問為什麼 int ** 不能轉成 int const …

看板C_and_CPP作者 (John)時間15年前 (2010/05/25 13:36), 編輯推噓9(9023)
留言32則, 7人參與, 最新討論串1/2 (看更多)
遇到的問題: (題意請描述清楚) int ** ipp; int const ** icpp = ipp; // Error int const * const * icpcp = ipp; // OK 程式跑出來的錯誤結果: invalid conversion 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) vc++ 2008, gcc 4.4 為什麼 line 2 無法編譯,line 3 又可以呢?,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.190.106

05/25 21:40, , 1F
看了頭都暈了.........
05/25 21:40, 1F

05/25 21:44, , 2F
VS2008 expresss 三行都可以過, 第三行最後漏了 ';'
05/25 21:44, 2F

05/25 21:46, , 3F
第二行 C 可以過, C++ 過不了
05/25 21:46, 3F

05/25 22:00, , 4F
對,第二行,c++ 沒辦法通過編譯器。
05/25 22:00, 4F
※ 編輯: photon3108 來自: 118.161.190.106 (05/25 22:00)

05/25 22:14, , 5F
他是要求你要用reinterpret_cast嘛?
05/25 22:14, 5F

05/25 22:22, , 6F
gcc 只有說 invalid conversion,沒有提及 r..._cast,
05/25 22:22, 6F

05/25 22:23, , 7F
line 2 感覺上好像滿合理的,只是不知錯在哪裡。
05/25 22:23, 7F

05/25 22:28, , 8F
其實我比較好奇什麼地方會用到這個 XD
05/25 22:28, 8F

05/25 22:29, , 9F
懂這個薪水可以拿比較高嗎
05/25 22:29, 9F

05/25 22:29, , 10F
實務上我沒有用過,但練習 const 與 pointer 時,對於
05/25 22:29, 10F

05/25 22:30, , 11F
line 2 沒辦法編譯過,感覺得相當的意外。
05/25 22:30, 11F

05/25 22:41, , 12F
只能說standard就這樣規定 沒什麼道理@_@
05/25 22:41, 12F

05/25 22:45, , 13F
給樓上,不是沒什麼道理的,可是我又懶得打一堆字....
05/25 22:45, 13F

05/25 22:47, , 14F
你可以想一下為何 float 可轉 int, 但float* 不能轉 int*
05/25 22:47, 14F

05/25 22:48, , 15F
或是把 int const * 給 typedef 成別的型別再試試看
05/25 22:48, 15F

05/25 22:54, , 16F
這邊是cv qualifier的問題吧 跟type沒什麼關係
05/25 22:54, 16F

05/25 22:58, , 17F
補一個 line 4: int * const * ipcp = ipp; // OK,感
05/25 22:58, 17F

05/25 22:59, , 18F
覺是不是與 line 4 的那個特定位置的 const 有關係?
05/25 22:59, 18F

05/25 23:01, , 19F
規定是 如果某處的cv qualifier不同(當然只能多不能少)
05/25 23:01, 19F

05/25 23:02, , 20F
則它右邊的指標全部要加const, 除了最後一個
05/25 23:02, 20F

05/25 23:03, , 21F
看你要怎麼解讀囉,把 int* 做個 typede 玩玩就知道了
05/25 23:03, 21F

05/25 23:07, , 22F
不懂樓上的意思@@
05/25 23:07, 22F

05/25 23:16, , 23F
icpp是一個pointer, 你可以de-ref兩次 ref到其值
05/25 23:16, 23F

05/25 23:16, , 24F
如果該值是const, 那麼當然在de-ref過程中 不能改變其值
05/25 23:16, 24F

05/25 23:17, , 25F
就是說 *icpp 你要得到 const int * const,
05/25 23:17, 25F

05/25 23:18, , 26F
萬一 *icpp = &other_int;是合法的 這樣const int就沒有
05/25 23:18, 26F

05/25 23:19, , 27F
意義了, 對client而言更是目瞪口呆
05/25 23:19, 27F

05/25 23:26, , 28F
const double PI=3.14; const double *pPI=Π
05/25 23:26, 28F

05/25 23:27, , 29F
void foo( const double ** pp){double db=0; *pp=&db;}
05/25 23:27, 29F

05/25 23:30, , 30F
*icpp = &other_int;這expression本身是合法的啊
05/25 23:30, 30F

05/25 23:38, , 31F
奇怪 我自己敲的sample是可以的... XD
05/25 23:38, 31F

05/25 23:57, , 32F
??? 不是吧 你要綁訂const, 中間的deref就要const阿
05/25 23:57, 32F
文章代碼(AID): #1B-z9wsQ (C_and_CPP)
文章代碼(AID): #1B-z9wsQ (C_and_CPP)