最令人烦恼的解析的目的是什么?

tem*_*boy 16 c++

维基百科上,我发现了这个:

A a( A() );
Run Code Online (Sandbox Code Playgroud)

[这]可以消除歧义

  1. class [ A] 的变量定义,取一个类[ A]或的匿名实例

  2. 函数的函数声明,它返回一个类型为[ A] 的对象,并获取一个(未命名的)参数,该参数是一个返回类型[ A](并且不进行输入)的函数.

大多数程序员都期望第一个,但C++标准要求它被解释为第二个.

但为什么?如果大多数C++社区都期望以前的行为,为什么不把它作为标准呢?此外,如果考虑解析歧义,则上述语法是一致的.

有人可以赐教吗?为什么标准要求这个?

Luc*_*ore 8

让我们说MVP不存在.

你会如何声明一个函数?

A foo();
Run Code Online (Sandbox Code Playgroud)

将是变量定义,而不是方法声明.你会介绍一个新的关键字吗?你有一个更尴尬的函数声明语法吗?或者你愿意拥有

A foo;
Run Code Online (Sandbox Code Playgroud)

定义变量和

A foo();
Run Code Online (Sandbox Code Playgroud)

声明一个函数?

稍微复杂的例子只是为了与这个基本的一致.更容易说"可以解释为声明的所有内容,将被解释为声明"而不是"可以解释为声明的所有内容,将被解释为声明,除非它是单个变量定义,在这种情况下这是一个变量定义".

可能是不是背后的动机,虽然,但一个原因,它是一个很好的事情.


Jer*_*fin 7

对于C++,它非常简单:因为规则是用C语言制作的.

在C中,歧义只出现在typedef一些相当模糊的代码中.几乎没有人偶然触发它 - 事实上,除了专门为证明这种可能性而设计的代码之外,它可能是罕见的.然而,无论好坏,仅仅是模糊性的可能性意味着有人必须解决它 - 如果记忆起作用,它由Dennis Ritchie解决,Dennis Ritchie下令任何可以被解释为声明的东西都是声明,即使作为定义也有模棱两可的解释.

C++增加了使用括号进行初始化以及将函数调用用作分组的能力,这使他将模糊性从模糊变为普通.然而,改变它将需要打破规则,因为它来自C.解决这种特殊的模糊性,正如大多数人所期望的那样,如果没有创造出更多的更令人惊讶的东西也可能是相当不平凡的,除非你愿意完全抛弃与C的兼容性.


Mar*_*ork 6

这是递归定义语法的副作用。

它不是故意这样设计的。它被发现并记录为最令人烦恼的解析。


K-b*_*llo 5

这只是一个猜测,但可能是因为使用给定的方法可以获得两种行为:

A a( A() ); // this is a function declaration
A a( (A()) ); // this is a variable definition
Run Code Online (Sandbox Code Playgroud)

如果要将其行为更改为变量定义,则函数声明将更加复杂.

typedef A subfunction_type();

A a( A() ); // this would be a variable declaration
A a( subfunction_type ); // this would be a function declaration??
Run Code Online (Sandbox Code Playgroud)