【发布时间】:2013-09-09 09:07:42
【问题描述】:
编译时:
char* p2c;
const char* p2cc = p2c; //fine
因为 lhs 指向类型具有 rhs 指向类型的所有限定符,所以没有:
char** p2p2c;
const char** p2p2cc = p2p2c; //fail
但确实如此:
const char * const * p2cp2cc = p2p2c; //fine
为什么会发生这种情况?
【问题讨论】:
-
最后一个例子只能用C++编译,不能用C编译。
-
在 C 和 C++ 中就是这样。这是两种不同的语言,具有不同的 const 正确性规则。在 C++ 中,
T **可转换为const T* const *。在 C 中,T **可转换为T* const *,但不能转换为T* const *。 stackoverflow.com/a/5249001/187690 -
@AndreyT 您的示例以相反的含义列出了相同类型;d (
T* const *) -
哦...复制粘贴错误。我的意思是说“在 C 中,
T **可转换为T* const *,但不能转换为const T* const *。 -
我将引用您的部分答案,我觉得它特别简洁:C++ 说您可以在任何间接深度添加 const-qualification,只要您还添加 const-qualification一直到顶层。在 C 中,您只能将 const 限定添加到顶级指针指向的类型,但不能更深。