为什么 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)
这样的函数指针?
例如,我通常把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)
这样的函数指针?