2017-02-11 114 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的正确位置的指南。 –

相关问题