當涉及到在指針轉換常量-正確性的規則,C語言支持從T *
類型的隱式轉換到用於非數組數據類型T
鍵入const T *
。這是C語言支持的唯一「常量保護」隱式轉換。
換句話說,如果T
和U
是相同非陣列類型的轉換從T *
const U *
到被支撐。如果T
與U
有某些不同,則隱式轉換無效(即使T
和U
之間的差異僅僅是一些額外的const限定符)。
簡而言之,您只能在最內層*
之後添加const
。您不得在任何更深層次的間接添加const
。這就是爲什麼您的p5
和cube
行不能編譯。
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從來沒有朝這個方向邁出任何一步。
來源
2017-02-11 18:07:12
AnT
「如何添加附加保護的規則」取決於您嘗試實現的保護措施。只有你知道你需要保護什麼以及不受保護的內容。 – AnT