2016-04-03 165 views
1

下面的代碼無法編譯:轉換型「的char **」,以「爲const char **」

char** s; 
    const char** s2 = s; 

我知道以下可以工作,但我認爲應該有一些做的更好合法的途徑它?

long long x = reinterpret_cast<long long>(s); 
    s2 = reinterpret_cast<const char**>(x); 

這個問題的背景是,我要使用具有 功能處理兩個庫的argc與不同的簽名/ ARGV:

void Init1(int argc, char** argv); 
void Init2(int argc, const char** argv); 

那麼什麼是定義我的主簽名的最佳途徑調用這兩個函數?

回答

2

在C++中,你可以添加或刪除const -ness通過const_cast,如:

char** s; 
const char** t = const_cast<const char**>(s); 

既然你正在處理的argv它應該是相當安全的常量性,只要加入到他們的Init2沒有按不要試圖改變任何東西,因爲它的論點是const char**

請注意,在刪除cv限定符後,如果要修改變量const的值,會導致未定義的行爲。

+0

這個轉換的問題不會與'Init2'試圖修改const字符(它不能在沒有強制轉換的情況下進行),而是通過設置const char *來指向一個地址實際的'const char',然後,例如,'Init1'試圖修改那個地址上的字符,只要它知道它應該是完全安全的,因爲它的參數是'char **'。所以不,這是不安全的。這就是編譯器抱怨的原因。 –