【发布时间】:2011-11-23 11:29:43
【问题描述】:
对于读取复杂的指针声明,有right-left rule。
但是这条规则没有提到如何阅读const修饰符。
例如在一个简单的指针声明中,const 可以通过多种方式应用:
char *buffer; // non-const pointer to non-const memory
const char *buffer; // non-const pointer to const memory
char const *buffer; // equivalent to previous declartion
char * const buffer = {0}; // const pointer to non-const memory
char * buffer const = {0}; // error
const char * const buffer = {0}; // const pointer to const memory
现在如何将const 与指针声明的指针一起使用?
char **x; // no const;
const char **x;
char * const *x;
char * * const x;
const char * const * x;
const char * * const x;
const char * const * const x;
阅读这些声明的简单规则是什么? 哪些声明有意义?
Clockwise/Spiral Rule 是否适用?
两个真实世界的例子
ASTUnit::LoadFromCommandLine 方法使用 const char ** 提供命令行参数(在 llvm clang 源中)。
getopt() 的实参向量参数声明如下:
int getopt(int argc, char * const argv[], const char *optstring);
在这种情况下,char * const argv[] 等同于 char * const * argv。
由于两个函数使用相同的概念(一个指向字符串的向量来提供参数)并且声明不同 - 显而易见的问题是:为什么它们不同?一个比另一个更有意义?
意图应该是:const 修饰符应该指定函数不操作此向量的字符串并且不改变向量的结构。
【问题讨论】:
-
我在 bookofbrilliantthings.com 的博客现在已经消失了,但您仍然可以在 web.archive.org/web/20130923181335/http://… 看到上面的文章
标签: c++ c constants declaration