看板 C_and_CPP 關於我們 聯絡資訊
這個問題印象中版上很久以前有討論過. [2-1] int n = 1; int *p1 = &n; const int **p2 = &p1; // Invalid (const int **) = (int **) 問題是 int ** 是否可轉型為 const int ** 答案是不可以. 理由是這樣可能會造成問題: 如果我們允許這個轉型的話則下面都會合法: const int c = 1; *p2 = &c; // (const int *) = (const int *) 合法 *p1 = 10; // (int) = (const int) 合法 這樣的話因為 p2 指向 p1, 所以 *p2 就是 p1, 而 *p2 = &c 會讓 p1 指向 c 這時 *p1 就是 c, 那 *p1 = 10 會改 c 的值為 10. 最後 c 的值因此會成為 10 而違反一開始 const 的性質. [2-2] int n = 1; const int *p1 = &n; int **p2 = &p1; // Invalid (int **) = (const int **) 問題是 const int * 是否可以轉型為 int ** 這個問題比較單純. 因為 p1 不只可以指向 n 也可以指向另一個 const 變數, 例如: const int a = 3; p1 = &a; // 我們讓 p1 改成指向 a (合法) **p2 = 10; // 會把 a 改成 10, 這違反 a 是 const 的性質是不應該發生的的 -- 我之前有寫過 const 相關的 blog: http://goo.gl/C58Lv6 (參考第 36 行) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.29.148 ※ 編輯: Feis 來自: 140.112.29.148 (01/21 17:52)
Keitaro:超詳細的解說 非常感謝!!! 01/21 18:00
Keitaro:小弟先拜讀您的詳解 有問題在回來請版上各位指點^^ 01/21 18:01
jackace:int**轉const int**在Ansi C中是合法但unsafe 見n1124.pdf 01/21 18:42
Feis:確實, 要考慮是 C 還是 C++ 會有差異 01/21 18:43
jackace:6.5.16.1 但C++的有增加rule去禁止 n1905.pdf 4.4 01/21 18:44
Feis:不過應該是語言差異而不是實作差異? 01/21 18:45
jackace:qualification conversion中第四點的第三項條件導致了此種 01/21 18:45
jackace:conversion的禁止 01/21 18:46
jackace:對 不是實作差異 是語言差異 01/21 18:46
BlazarArc:推 01/22 15:44
johnjohnlin: 推~ 02/07 17:56