根據標準(第5.2.11節),一個const_cast將cv-qualifiers(const或volatile)轉換掉。爲什麼const_cast需要說明你要投射的內容?
下面是一個簡單的例子。首先聲明兩個函數採用指針和參考:使用適當的const_cast
Bar b;
const Bar& cb = b;
,然後你可以調用函數:
class Bar { ... };
void foo_ptr(Bar*);
void foo_ref(Bar&);
然後創建一個參考給const
foo_ptr(const_cast<Bar*>(&cb));
foo_ref(const_cast<Bar&>(cb));
這是我的問題:因爲const_cast無法完成其他演員設計的內容,所以您投射的內容不是很明顯嗎?換句話說,爲什麼不語讓我簡單地說:
foo_ptr(const_cast<>(&cb));
foo_ref(const_cast<>(cb));
我能想到的只有以下兩個原因:
一)編譯器應該停止我,當我嘗試做一些發瘋一樣:
foo_ptr(const_cast<int*>(&cb));
foo_ref(const_cast<int&>(cb));
並迫使我明確指出我鑄造它,然後可以讓我從行爲不端的類型。我覺得這個(假設的)解釋很弱,因爲如果語言傾向於讓我寫下錯誤只是爲了讓編譯器糾正我,那將是很奇怪的。
b)如果變量既是常量又是易失性的,則可能存在歧義。在這種情況下,編譯器將無法告訴我是否試圖拋棄這一個或另一個(或兩者)。
這是爲什麼,還是有其他原因?
當然,該運算符還允許`const_cast <>(&b)`(其中b不是`const')和相同的結果類型集合,所以即使它沒有處理波動性,您也必須問Alexandros無論const_cast <>是否應該切換常量或默認添加或刪除它(後者會使它有點用詞不當)。正如你所說,在模板中,通常需要在不知道開始的情況下獲得const或非const類型。 – 2010-12-08 03:07:21
@Tony:關於b不需要是const的好處。更一般地說,儘管我知道const_cast也可以添加const,但我的隱含假設是沒有人這樣做(因爲還有其他方法可以這樣做),因此如果輸入b不是const,那麼就讓它成爲。 – 2010-12-08 03:22:35