gpt4 book ai didi

c++ - 我对值初始化的尝试被解释为一个函数声明,为什么不使用a(());?解决这个问题?

转载 作者:行者123 更新时间:2023-12-02 10:57:19 26 4
gpt4 key购买 nike

Stack Overflow教给我的很多东西就是所谓的“最烦人的解析”,经典地用诸如

A a(B()); //declares a function

虽然在大多数情况下,直观上似乎是类型为 a的对象 A的声明,以一个临时 B对象作为构造函数参数,但实际上它是一个函数 a的声明,返回了 A,并使用了指向返回函数的指针 B本身不带任何参数。同样的线
A a(); //declares a function

也属于同一类别,因为它声明一个函数而不是对象。现在,在第一种情况下,此问题的通常解决方法是在 B()周围添加额外的括号/括号集,因为编译器随后将其解释为对象的声明
A a((B())); //declares an object

但是,在第二种情况下,执行相同操作会导致编译错误
A a(()); //compile error

我的问题是,为什么?是的,我非常清楚正确的“解决方法”是将其更改为 A a;,但是我很好奇,在第一个示例中,多余的 ()对编译器起作用是什么,然后在重新应用时不起作用在第二个示例中。 A a((B()));解决方法是否是写入标准的特定异常(exception)?

最佳答案

没有开明的答案,仅是因为C++语言没有将其定义为有效语法。

如果您确实有一个表达式,那么它是有效的。例如:

 ((0));//compiles

简而言之:因为 (x)是有效的C++表达式,而 ()不是。

要了解有关如何定义语言以及编译器如何工作的更多信息,您应该了解 Formal language theory或更具体地说 Context Free Grammars (CFG)以及诸如有限状态机之类的相关资料。如果您对此感兴趣,尽管Wikipedia页面还不够,那么您将不得不获得一本书。

关于c++ - 我对值初始化的尝试被解释为一个函数声明,为什么不使用a(());?解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58989768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com