char * const a;
const char * a;
一个是指向char的常量指针。另一个是指向char const的指针。
我认为有一种特定的方式。像执行顺序的东西。我认为应该有括号或其他东西。
任何人都可以向我解释为什么指针是const而不是另一个吗?
char * const a, for example.
这会变成(char *) const a
或
const char * a
是(const (char *)) a
在What is the difference between const int*, const int * const, and int const *?中,我得到了许多似乎没有意义的解释。
一种解释是向后阅读。
另一种解释是拆分*并查看const是在右侧还是左侧。
然后还有另一个顺时针做法的理论
http://c-faq.com/decl/spiral.anderson.html
规则似乎不是真正的实际正式规则。我甚至不确定该规则是否适用于更复杂的类型。更不用说这些规则只适用于英语。
好的,这里的实际正式规则是什么以及参考是什么?
我认为必须有一个更为简单的规则,为什么会这样。
例如,单词const是应用于左侧还是右侧?我们可以像我建议的那样放置括号吗?
答案 0 :(得分:2)
规则符合C ++标准。您可以从here链接下载免费草稿。
附录A.6和A.7具有完整的语法规范。声明符的描述在章节[dcl]
中。特别参见[dcl.ptr]
部分,例如#1:
在声明
T D
中D
的格式为
*
attribute-specifier-seq opt cv-qualifier-seq opt {{ 1}}并且声明
D1
中的标识符类型是“ derived-declarator-type-listT D1
,”然后是{{1的标识符的类型是“ derived-declarator-type-list cv-qualifier-seq 指向T
的指针。” cv-qualifiers 适用于指针而不是指向的对象。类似地,可选的 attribute-specifier-seq (7.6.1)附加到指针而不是指向的对象。
该部分的其余部分包含一堆澄清的例子。
答案 1 :(得分:1)
规则是非常简单,如果const
位于*
的右侧:它是指针const
。如果const
位于*
的左侧,则指向的对象为const
。
答案 2 :(得分:1)
const指针声明的pragmatic online reference语法可以节省下载draft version of any C++ Standard(SO社区维护列表)的大约1400页。
C ++编程语言 Bjarne Stroustrup ISBN 0-321-563840(每个前者)附录A 中涵盖了正式语法版本也会这样做)。在第5.4.1章(第3版)中,Bjarne Stroustrup描述了这种语法多样性背后的原因如下:
使指针不变的声明符运算符是
*const
。没有const*
声明符运算符,因此const
之前出现的*
被视为基类型的一部分。
编译器实施者最有可能不喜欢 [1] 这个"功能":如果您尝试以下声明,
const char const * const a;
您将看到在C ++编译器中实现了特殊规则,它可能会告诉您它。 GNU GCC编译器例如说明
错误:重复' const'
[1] ...但与unsigned long literals...
创建的愤怒相比,这种愤怒似乎微不足道