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

标签 c++

在 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/

相关文章:

c++ - Memcached 如何确保它在内存中的页面不会被其他页面换出?

c++ - std::ofstream 不写入文件

c++ - 将 const 左值引用作为右值引用传递

c++ - 在UNIX上 “internal compiler error: storage failure”是什么意思?

c++ - 对象的内部表示

c++ - Haskell 可以像 Clang/GCC 一样优化函数调用吗?

c++ - 声明时的默认值

c++ - 括号之间的两个字符串在 C++ 中用逗号分隔

c++ - '打开文件名': undeclared identifier

c++ - 在 C++ 中读取制表符分隔的文件