gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:30:50 24 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())); 是否解决了写入标准的特定异常?

最佳答案

没有开明的答案,只是因为它没有被 C++ 语言定义为有效的语法……所以,根据语言的定义。

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

 ((0));//compiles

更简单地说:因为 (x) 是一个有效的 C++ 表达式,而 () 不是。

要了解有关如何定义语言以及编译器如何工作的更多信息,您应该了解 Formal language theory或更具体地说Context Free Grammars (CFG)和相关 Material ,如有限状态机。如果您对此感兴趣,尽管 wikipedia 页面还不够,但您必须得到一本书。

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

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