試圖瞭解const_cast的用法。代碼如下:const_cast C++對我不起作用
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
...產生運行時錯誤。
另一個問題,在內存中,運行時(它)如何知道這個區域是否爲常量,這種標記是什麼?
試圖瞭解const_cast的用法。代碼如下:const_cast C++對我不起作用
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
...產生運行時錯誤。
另一個問題,在內存中,運行時(它)如何知道這個區域是否爲常量,這種標記是什麼?
該代碼調用未定義的行爲;寫入字符串文字是無效的(實際上也不適用於任何const
對象)。
C++標準沒有定義這將如何失敗(或者即使它必須失敗)。但在典型的平臺上,將由操作系統和底層硬件來檢測問題。 "bb"
的存儲通常位於可執行文件的專用部分,該部分標記爲只讀。見例如http://en.wikipedia.org/wiki/Memory_protection。
然而,const_cast
的用途不會調用未定義的行爲。例如:
int x = 5; // Not a const object
const int *p = &x;
int *q = const_cast<int *>(p);
*q = 6; // This is ok
爲什麼你說字符串const必須失敗,你在這裏指的是什麼? – Moatz 2012-04-24 23:28:43
@Moatz:我的意思是不能保證寫入字符串文字會導致崩潰或錯誤消息。 – 2012-04-24 23:35:05
該字符串可能放在靜態內存中。所以這是一個未定義的行爲。 試試這個
char t[]="bb";
const char* text = t;
(const_cast<char&>(*text))='a';
cout<<*text;
您只能const_cast會,你知道的東西是不是真的常量。在這種情況下,即使文本是const,我們也知道它指向的是不是const的。因此我們可以安全地拋棄const。
一般來說,運行時不知道是否知道某個特定變量是否實際爲const
。如果拋棄const
-ness,如果最終寫入一個定義爲const的變量(而不是正常變量,您碰巧有一個const指針/引用),則會得到未定義的行爲。
如果他們想要命令運行時知道const
的事情,那麼當你寫入const變量時,他們可能會規定特定的行爲(例如拋出特定的異常)。有些系統很容易支持 - 但其他系統不會,所以不需要特定的響應。
恕我直言 - 這是一個壞主意使用強制轉換 - 避免它們,只有在必要時才使用它們。我有強烈的感覺,那些使用演員的人在他們的設計上有錯誤。 – 2012-04-24 18:33:56