考虑一下程序是否是这样的:
typedef struct A { int m; } A;
int main() { A a( A() ); }
这将是有效的 C,并且 C 的语法只允许一种可能的解释:a
被声明为函数。C 只允许使用(而不是括号)进行初始化=
,并且不允许A()
被解释为表达式。(函数样式转换是 C++ 独有的特性。)这不是 C 中的“令人烦恼的解析”。
正如 Wikipedia 指出的那样,C++ 的语法使这个例子变得模棱两可。但是,如果您希望 C++ 赋予该程序与 C 相同的含义,那么显然,C++ 编译器将不得不a
像 C 编译器一样将其解释为函数。当然,C++可以改变这个程序的含义,a
定义一个类型为 的变量A
。然而,只有在有充分理由时才将与 C 的不兼容性引入 C++,我想 Stroustrup 特别希望避免此类潜在的无声破坏,因为它们会给迁移到 C++ 的 C 用户带来极大的挫败感。
因此,C++ 也将其解释为函数声明,而不是变量定义;更一般地说,采用的规则是,如果看起来像函数样式转换的东西可以在其句法上下文中被解释为声明,那么它应该是。通过确保不采用 C 中不可用的解释(即涉及函数样式转换的解释),这消除了在所有令人烦恼的解析情况下与 C 不兼容的可能性。
Cfront 2.0 Selected Readings(第 1-42 页)在表达式声明歧义的情况下提到了 C 兼容性问题,这是最令人头疼的解析的相关类型。