2014-03-04 106 views
0
void process(int boat) { ; } 

const void(*sequence_A[])(int) = { process, process }; //ERROR 
const void(**func_sequence)(int) = sequence_A; 

(*func_sequence++)(7); 

爲什麼不能編譯?我希望const引用數組,而不是數組的內容。函數指針的const數組befuddles

Error 1 error C2440: 'initializing' : cannot convert from 'void (__cdecl *)(int)' to 'const void (__cdecl *)(int)' 

編輯:所以你們說它不存在。很公平。只是要清楚,我張貼的我想要的功能,這個比喻,但這是爲int而不是函數的師生比

//Compiles without error 
int number1 = 7; 
int number2 = 3; 
const int* sequence_B[] = { &number1, &number2 }; 
const int** numbers = sequence_B; 

int check = **numbers++; //value is 7 
int chec2 = **numbers++; //value is 3 
+0

不幸的是沒有這樣的東西'const'陣列,除了在'常量數組的感'物品。 –

回答

2

好吧,讓我們來分析你的話的含義

const void(*sequence_A[])(int) = { process, process }; //ERROR 

我記得解析*x[]的方法是main的第二個參數是char* argv[],所以它是一個指針數組。換句話說,sequence_A將被編入索引,然後結果將被解除引用。

然後,您可以應用一個函數調用參數圓括號,其值爲int,因此您應該得到一個…

const void

那麼這並不完全有意義。您可以使用指向const void的指針,但不能取消引用該指針:您無法直接「進入」const void。然而這裏有一些指向產生的函數作爲其表達式值 a const void

要匹配,你將需要

const void process(int boat) { ; } 

,雖然我還沒有嘗試過,我懷疑任何編譯器將接受它。 [更新:事實證明,至少g ++接受它,所以它是一個解決方案。但這是一個非常規的功能簽名。 [

總之,刪除const


與此相關的,如你不能有一個const原始陣列,除了在const項目原始陣列意義上的評論已經提到。

它的語言,從C.

繼承隨着陣列型衰減到指針有問題的類型系統的像差,也有問題的角部的情況。


附錄:例如如何使數組項const

void process(int boat) { ; } 

int main() 
{ 
    void(* const sequence_A[])(int) = { process, process }; // OK 
    //sequence_A[0] = process;  //ERROR 
} 
+0

好吧,所以這個功能只是任意的不可用。我確實在懷疑是否是這種情況。 – spinning