精華區beta C_and_CPP 關於我們 聯絡資訊
之前再思考有關 bitwise const 以及 logical const 的問題 我就隨手寫了一個更改 const int 的程式 ============================== #include <iostream> using namespace std; int main() { const int x = 100; int* py = const_cast<int*>(&x); *py = 9; cout << "(addr,value) of x ==> " << "(" << hex << &x << "," << dec << x << ")" << endl; cout << "(addr,value) of *py ==> " << "(" << hex << py << "," << dec << *py << ")" << endl; return 0; } =============================== 原本以為會印出來如下: (addr,value) of x ==> (xxx,9) // xxx 代表某 address (addr,value) of *py ==> (xxx,9) 結果卻出乎我意料之外: (addr,value) of x ==> (xxx,100) // xxx 代表某 address (addr,value) of *py ==> (xxx,9) 同一個位置上的值卻不一樣 = = (我對 const 的認知好像又被顛覆了 = =) 我在 VS 2008 和 gcc 3.4.5 version 上跑都是一樣的結果。 4239篇 dotwsc 大大有類似的問題 (但他用的 compiler 可以改動到 const 的值) 是不是 C++ 的標準規格又多了甚麼限制嗎? 還是甚麼原因 請教各位 謝謝 @@") -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.170.154
hilorrk:如果我沒記錯 用強制轉換去掉const的pointer來做賦值的動 04/29 10:28
hilorrk:作本來就是undefined behavior...結果一樣只是碰巧吧? 04/29 10:29
spider391:我改成 C 的寫法用 c compiler 可以修改 04/29 10:31
hilorrk:我一直都覺得強制轉型在多數情況下都是錯誤的設計才會產生 04/29 10:31
hilorrk:簡單來說 const_cast只是把const去掉以適應某些狀況 04/29 10:32
hilorrk:但不表示你可以去修改這個值..改了會發生什麼事我也不知道 04/29 10:32
spider391:上面網站上有個說法,我覺得還不錯可以參考 04/29 10:51
> -------------------------------------------------------------------------- < 作者: spider391 (小乖) 看板: C_and_CPP 標題: Re: [問題] 修改 const int x = 100; 時間: Thu Apr 29 11:01:35 2010 感謝 h 大: 以下是標準規格書的說法 ISO 14882:2003 says in paragraph 7.1.5.1/4: "Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior." 所以結論就是: Do not cast pointers to constants to pointers to variables. : ============================== : #include <iostream> : using namespace std; : int main() : { : const int x = 100; : int* py = const_cast<int*>(&x); : *py = 9; : cout << "(addr,value) of x ==> " << "(" << hex << &x << "," << dec << x << : ")" << endl; : cout << "(addr,value) of *py ==> " << "(" << hex << py << "," << dec << *py : << ")" << endl; : return 0; : } : =============================== : 是不是 C++ 的標準規格又多了甚麼限制嗎? 還是甚麼原因 : 請教各位 謝謝 @@") -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.170.154