2011-03-23 39 views
3

我已經聲明爲一個函數:C/C++鑄造成const古怪

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?我正在將float **轉換爲const float **。那可能出什麼問題? :/

編輯:感謝您令人難以置信的快速反應! :)

回答

0

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

+1

無法解釋原因 – 2011-03-23 18:21:08

+0

@大衛:其他答案解釋說。我只是懶惰:P – Nawaz 2011-03-23 18:25:28

0

謝謝大家的答案。我現在已經通讀了Faq並完成了一些編譯器測試,現在我完全理解它是如何工作的。最後;)

+3

StackOverflow的格式與常規論壇不同。你不應該試圖添加一個答案來保持對話。爲此目的使用評論。 – 2011-03-23 18:20:43

+0

@大衛:對不起,這實際上是爲了防止它繼續下去,因爲我已經在這裏掌握了答案:) – Robert 2011-03-24 18:56:48

+0

沒問題:)你總是可以接受一個答案,而這非常暗示你滿意。 – 2011-03-25 08:45:07

1

只是添加一個重要的觀察到大多數有效的答案:事情是不同的C和C + +。然而,這個技巧在C++中的工作原理與Foo const* const*這不適用於C,它不會接受這一點,併發出警告。

在C語言中,如果想將類型安全轉換爲Foo const* const*,則必須採用更復雜的方法。

+0

我無法找到爲什麼C(甚至是C11)與C++相反,不允許將'Foo **'隱式轉換爲'Foo const * const *'的原因。你碰巧知道嗎? – 2013-12-19 14:01:52

+0

我有模糊的記憶,委員會認爲,強制執行這樣的規則對於直接編譯器實現來說太複雜了。 (那麼這些野獸是否曾經存在過?)無論如何,這在C中是一個真正的限制,並且使得對於多維函數參數使用'const'幾乎是不切實際的。 – 2013-12-19 15:04:53

+0

這讓我想哭。這是一個真實的,客觀的缺陷。我從來沒有寫過一個編譯器,但是我沒有看到允許添加任何長度的隱式添加'const'的鏈,而不是隻有長度<= 1。 – 2013-12-19 16:57:12