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

C++ 最令人烦恼的解析的目的是什么?,c++,C++,我发现了这个: A a( A() ); [这]可以作为 类[a]的变量定义,采用类[a]的匿名实例,或 函数的函数声明,该函数返回类型为[a]的对象,并接受一个(未命名)参数,该参数是返回类型为[a]的函数(且不接受输入) 大多数程序员都希望第一个,,但是C++标准要求它被解释为第二个。< /强> < /P> 但是为什么呢?如果C++社区中大多数人都期望以前的行为,为什么不把它作为标准呢?此外,如果不考虑解析歧义,上述语法是一致的 有人能告诉我吗?为什么该标准将此作为一项要求?除了K-ball

我发现了这个:

A a( A() );
[这]可以作为

  • 类[
    a
    ]的变量定义,采用类[
    a
    ]的匿名实例,或

  • 函数的函数声明,该函数返回类型为[
    a
    ]的对象,并接受一个(未命名)参数,该参数是返回类型为[
    a
    ]的函数(且不接受输入)

  • <>大多数程序员都希望第一个,<强>,但是C++标准要求它被解释为第二个。< /强> < /P> 但是为什么呢?如果C++社区中大多数人都期望以前的行为,为什么不把它作为标准呢?此外,如果不考虑解析歧义,上述语法是一致的


    有人能告诉我吗?为什么该标准将此作为一项要求?

    除了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++班做办公室时间,其中一个学生在他的作业中有这个: