2017-02-11 42 views
2

我正在尋找關於如何使用const添加附加保護的規則。什麼是添加const的正確方法?

例如:

int** p1 = ...; 
int** const p2=p1; // Legal 
int* const * const p3=p1; // Legal 
int* const * const p4=p3; // Legal 
const int* const * const p5=p3; // Error 

int*** cube1= &p1; 
int* const ** cube2=cube1; // Error 
and so on... 
+0

「如何添加附加保護的規則」取決於您嘗試實現的保護措施。只有你知道你需要保護什麼以及不受保護的內容。 – AnT

回答

2

當涉及到在指針轉換常量-正確性的規則,C語言支持從T *類型的隱式轉換到用於非數組數據類型T鍵入const T *。這是C語言支持的唯一「常量保護」隱式轉換。

換句話說,如果TU相同非陣列類型的轉換從T *const U *到被支撐。如果TU有某些不同,則隱式轉換無效(即使TU之間的差異僅僅是一些額外的const限定符)。

簡而言之,您只能在最內層*之後添加const。您不得在任何更深層次的間接添加const。這就是爲什麼您的p5cube行不能編譯。

int *p = 0; 
const int *cp = p; // OK: `const` is added after the first `*` 

int **pp = 0; 
const int *const *cpp = pp; // Error: a "deep" `const` added 

有時候,在你的代碼,你可能需要規避這些限制,並在間接的更深層次添加一些額外的const。在這種情況下,你別無選擇,只能使用明確的轉換。

int **pp = 0; 
const int *const *cpp = (const int *const *) pp; 

P.S. C++放寬了這些限制中的一部分,創建了更合乎邏輯的常量正確性規則系統。唉C從來沒有朝這個方向邁出任何一步。

+0

嗨,謝謝你的快速回答!問題 - 爲什麼int * const ** cube2 = cube1'不工作,即使當我在最內層的'*'之後添加const時? –

+0

@StavAlfi:「最內層的'*'」我的意思是最深的'*'。在這種情況下,你在第二個'*'後面添加'const'。這不是最內在的一個。 – AnT

+0

什麼是「righmost'*'」? –

2

const通常適用於在其左側定義的值。

實施例:

int const *ptr = &val; 
在上面的代碼段

const屬於int而不是*ptr

如果移動*背後const,它將使ptr常量指針

int *const ptr = &val; 

現在const屬於指針,而不是int

現在看看另一個例子

const int *ptr = &val; 

只有當在最左邊有一個const一個聲明,然後它適用於它的右側,在上面的代碼片段中,它是int

+0

感謝您的信息,但我沒有看到它是如何回答我的問題。 Sory如果我的問題不夠清楚。我正在尋找一些關於如何找到放置const的正確位置的指南。 –

相關問題