簡體   English   中英

C / C ++轉換為const古怪

[英]C/C++ Cast to const weirdness

我有一個函數聲明為:

int myFunction(const float** ppArr, const int n, const int m);

當我這樣稱呼時:

float** ppArr = new float*[5];
// Some initialization of ppArr

int result = myFunction(ppArr, 5, 128);  <<<< Error

而錯誤是(VS 2008 Express):

error C2664: 'Test_myFunction.cpp' : cannot convert parameter 1 from 'float **' to 'const float **'

WTF? 我正在將一個浮動**轉換為const float **。 可能出現什么問題? :/

編輯:謝謝你非常快速的回復! :)

雖然看起來很奇怪,它實際上可以減少某些模糊情況下的const正確性,允許您間接修改const對象。

有關詳細信息,請參閱http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17

你可以做的是將Foo**轉換為Foo const* const* ,因為它不會讓任何后門打開。

只是為大多數有效的答案添加一個重要的觀察結果:C和C ++的情況有所不同。 雖然這個技巧在C ++中使用Foo const* const*但這在C中不起作用,它不接受這個並發出警告。

在C中,如果你想對Foo const* const*進行類型安全轉換,你必須采用更復雜的方法。

float**無法轉換為const float**

它可以轉換為float* const*const float* const* 像這樣:

void f(float* const* p) {}

void h(const float* const* p) {}

int main() {
    float** p= new float*[5];
    f(p);
    h(p);
}

與GCC編譯: http//ideone.com/RrIXl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM