什么语法规则解释了C ++编译器如何在变量声明中处理const关键字

时间:2014-06-17 09:40:26

标签: c++ syntax const

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是应用于左侧还是右侧?我们可以像我建议的那样放置括号吗?

3 个答案:

答案 0 :(得分:2)

规则符合C ++标准。您可以从here链接下载免费草稿。

附录A.6和A.7具有完整的语法规范。声明符的描述在章节[dcl]中。特别参见[dcl.ptr]部分,例如#1:

  

在声明T DD的格式为

     

* attribute-specifier-seq opt cv-qualifier-seq opt {{ 1}}

     

并且声明D1中的标识符类型是“ derived-declarator-type-list T 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之前出现的*被视为基类型的一部分。

询问您的C ++编译器!

编译器实施者最有可能不喜欢 [1] 这个"功能":如果您尝试以下声明,

const char const * const a;

您将看到在C ++编译器中实现了特殊规则,它可能会告诉您它。 GNU GCC编译器例如说明

  

错误:重复' const'


[1] ...但与unsigned long literals...

创建的愤怒相比,这种愤怒似乎微不足道