为什么 C++ 类型表达式不是从左到右解释的?

Why are C++ type expressions not interpreted left to right?

例如,我通常把int const * const *倒读成"pointer to a constant pointer to a constant integer"。为什么 C++ 不期望它像 * const * const int 那样从左到右。如果将语言更改为这种风格,是否会导致与其他 C++ 语言功能的兼容性问题?

我知道像 const 这样的限定符可以出现在基类型的任何一侧。星号和后续常量的一面是我真正想要的。

它来自 C,其中类型被编写为模仿表达式的值类型,并在其周围使用相同的装饰。表达式 *p 的类型是什么?

星星被分配给变量。指针不是特殊类型,而是变量的特殊行为。 所以

int *a, b;

表示 a 是指向整数的指针,而 b 只是整数。 要同时拥有一个整数将是:

int *a, *b;

有了你的建议,这种理解就没有了。但是您可以使用 C++11 中引入的智能指针。

它最终来自这样一个事实,不幸的是,* 是一个前缀运算符,可能派生自 B、BCPL 等。比较 Pascal,其中的推导运算符是 ^ 并且是后缀。如果 C * 运算符是后缀:

  • 指向函数的语法是可以理解的,不需要括号
  • -> 运算符不是必需的:相反,您只需编写 ptr*.member.

Kernighan & Ritchie 自己解释了指针语法背后的基本原理(K&R,第一版,第 90 页):

int *px; is intended as a mnemonic: it says that the combination *px is an int, that is if px occurs in the context *px it is equivalent to avariable of type int. In effect the syntax of the declaration for a variable mimics the syntax of the expression in which the variable may appear.

与您假设的倒置语法相关的附加说明:

  • 标准语法允许混合使用指针和非指针:int a,*px, atoi(char*); 这在倒置语法中是不可能的。
  • 此标准语法允许以一致的方式组合指针和数组:char *s[10] 是一个包含 10 个指向 char 的指针的数组。您对此的倒置语法是什么: [10]* char s* char s[10] ?如果将第二个维度添加到数组中,它会保持一致吗?
  • 最后,您将如何在倒排语法中一致地声明像 char *(*f)(int) 这样的函数指针?