在维基百科上,我发现了这个:
A a( A() );
Run Code Online (Sandbox Code Playgroud)
[这]可以消除歧义
class [
A] 的变量定义,取一个类[A]或的匿名实例函数的函数声明,它返回一个类型为[
A] 的对象,并获取一个(未命名的)参数,该参数是一个返回类型[A](并且不进行输入)的函数.大多数程序员都期望第一个,但C++标准要求它被解释为第二个.
但为什么?如果大多数C++社区都期望以前的行为,为什么不把它作为标准呢?此外,如果不考虑解析歧义,则上述语法是一致的.
有人可以赐教吗?为什么标准要求这个?
让我们说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)
声明一个函数?
稍微复杂的例子只是为了与这个基本的一致.更容易说"可以解释为声明的所有内容,将被解释为声明"而不是"可以解释为声明的所有内容,将被解释为声明,除非它是单个变量定义,在这种情况下这是一个变量定义".
这可能是不是背后的动机,虽然,但一个原因,它是一个很好的事情.
对于C++,它非常简单:因为规则是用C语言制作的.
在C中,歧义只出现在typedef一些相当模糊的代码中.几乎没有人偶然触发它 - 事实上,除了专门为证明这种可能性而设计的代码之外,它可能是罕见的.然而,无论好坏,仅仅是模糊性的可能性意味着有人必须解决它 - 如果记忆起作用,它由Dennis Ritchie解决,Dennis Ritchie下令任何可以被解释为声明的东西都是声明,即使作为定义也有模棱两可的解释.
C++增加了使用括号进行初始化以及将函数调用用作分组的能力,这使他将模糊性从模糊变为普通.然而,改变它将需要打破规则,因为它来自C.解决这种特殊的模糊性,正如大多数人所期望的那样,如果没有创造出更多的更令人惊讶的东西也可能是相当不平凡的,除非你愿意完全抛弃与C的兼容性.
这只是一个猜测,但可能是因为使用给定的方法可以获得两种行为:
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)
| 归档时间: |
|
| 查看次数: |
877 次 |
| 最近记录: |