C++ 最令人烦恼的解析的目的是什么?
我发现了这个:C++ 最令人烦恼的解析的目的是什么?,c++,C++,我发现了这个: A a( A() ); [这]可以作为 类[a]的变量定义,采用类[a]的匿名实例,或 函数的函数声明,该函数返回类型为[a]的对象,并接受一个(未命名)参数,该参数是返回类型为[a]的函数(且不接受输入) 大多数程序员都希望第一个,,但是C++标准要求它被解释为第二个。< /强> < /P> 但是为什么呢?如果C++社区中大多数人都期望以前的行为,为什么不把它作为标准呢?此外,如果不考虑解析歧义,上述语法是一致的 有人能告诉我吗?为什么该标准将此作为一项要求?除了K-ball
A a( A() );
[这]可以作为a
]的变量定义,采用类[a
]的匿名实例,或a
]的对象,并接受一个(未命名)参数,该参数是返回类型为[a
]的函数(且不接受输入)有人能告诉我吗?为什么该标准将此作为一项要求?除了K-ballo确定的情况外,没有其他特殊原因 这只是遗产。已经有
intx代码>构造形式,因此要求tx似乎从来都不是一个目标代码>当没有ctor参数处于活动状态时
事后看来,我会想,如果语言是从零开始设计的,那么MVP就不存在了。。。还有大量的C++异常。
<>追忆C++发展了几十年,甚至现在只由委员会设计(参见:): < P>这只是猜测,但可能是因为给定的方法你可以得到两种行为:
A a( A() ); // this is a function declaration
A a( (A()) ); // this is a variable definition
如果将其行为更改为变量定义,那么函数声明将相当复杂
typedef A subfunction_type();
A a( A() ); // this would be a variable declaration
A a( subfunction_type ); // this would be a function declaration??
这是递归定义语法的副作用
它不是故意这样设计的。它被发现并记录为最烦人的解析。假设MVP不存在。
如何声明函数
A foo();
将是变量定义,而不是方法声明。你能介绍一个新的关键字吗?对于函数声明,您会使用更为笨拙的语法吗?还是你宁愿
A foo;
定义一个变量并
A foo();
声明一个函数
A foo();
您稍微复杂一点的示例只是为了与这个基本示例保持一致。更容易说“可以解释为声明的一切都将被解释为声明”,而不是“可以解释为声明的一切都将被解释为声明,除非它是一个单变量定义,在这种情况下,它是一个变量定义”
这可能不是它背后的动机,但这是一个好的原因。
< P> C++,它很简单:因为规则在C. 中是这样做的。
在C语言中,歧义只出现在typedef
和一些相当模糊的代码中。几乎没有人会意外地触发它——事实上,除了专门为证明这种可能性而设计的代码外,它很可能是罕见的。然而,不管是好是坏,仅仅是歧义的可能性就意味着必须有人来解决它——如果记忆有用的话,这是由丹尼斯·里奇解决的,他裁定任何可以解释为声明的东西都是声明,即使定义也有歧义的解释
C++增加了使用括号进行初始化以及将函数调用作为分组的功能,这使得模糊性从模糊变为常见。然而,改变它需要打破规则,因为它来自C。正如大多数人所预期的那样,解决这个特殊的模糊性,而不创造更多更令人惊讶的半打,可能也是相当不平凡的,除非您愿意完全放弃与C的兼容性。哪里有函数指针?请阅读错误消息-t(*)(
)类型的函数指针不是吗?@templateboy:消息是误导性的:在这种情况下,a
基本上已衰减为函数指针,用于表达式a.f
,但是a
的声明本身与函数指针无关。@我可以解释一下吗?不太正确,a(a())代码>是一个函数声明。它可以被重写为A(A(*)()
),也就是说,一个名为A
的函数,返回一个A
类型的对象,其参数为函数:void->A
。试着编译它以进行最简单的检查)你能详细说明一下吗?@TanveerBadar他们并不是有意设计这种语言来让它变得复杂,而是应该是合乎逻辑的。但是由于C++的复杂性,一些事情已经超过了原来的设计者,我们现在已经习惯了。“最烦人的解析”只是一个名称,它是在语言使用一段时间后发现的一个常见问题。我们不能打破向后兼容性,所以我们无法修复语言(不是直接的,尽管我们已经加入了语言,使这不成为一个问题)。我只是为一个本科C++班做办公室时间,其中一个学生在他的作业中有这个: