2011-04-13 26 views
6

最近我絆瞭如下代碼:編譯器切換爲禁用c樣式轉換中的const_cast語義?

void foo(const Bar* b) { 
    ... 
    takes_nonconst_param_fn((Bar*)b); 
    ... 

顯然,開發商根本不知道他在做什麼,但如果編譯器早已不是默默接受C風格的鑄造和至少需要一個合適的const_cast,他可能會在做這件事之前兩次。因此,這讓我想到,現代編譯器是否有一個開關,以防止C語言風格的const_cast語義?

這簡直是不實際的,以防止C-風格類型轉換的所有出現,這是一個必要之惡,讓他們static_reinterpret_語義(如果僅僅是一些庫代碼),但我的印象是,C-的合法使用拋棄const4的樣式拋出在代碼庫中非常罕見,所以也許應該可以完全禁用它。

+0

如果你將foo聲明爲'void foo(const Bar * b)const',它會有什麼區別嗎? – James 2011-04-13 14:24:36

+2

@詹姆斯:你爲什麼期望影響外顯表演的效果?如果'foo'是一個成員函數,那麼這會使函數內的對象成員爲'const';如果不是,那麼這將是一個錯誤。 – 2011-04-13 14:45:39

+1

其實我希望我可以禁用所有,但他們的'static_cast'形式。 – 2011-04-13 14:51:33

回答

7

GCC有選項-Wcast-qual在C風格轉換刪除類型限定符時發出警告。結合-Werror,你可以完全防止它,如果你想。

+4

還要考慮所有舊演員的風格演員陣容。 – 2011-04-13 14:53:42

+0

尼斯:我需要添加到我需要的標誌列表中的另一個標誌。 – 2011-04-13 17:09:26