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 ,如有限状态机。如果您对此感兴趣,虽然维基百科页面还不够,但您必须买一本书。

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

相关文章:

c++ - 来自 boost asio io_service get_service() 的错误指针

c++ - c++中swap是如何实现的

C++ RSA 签名

c++ - 如何在 GTK+ 中拉伸(stretch)图像?

C++ - 枚举范围? Bjarne Stroustrup 书

c++ - OpenCV源代码目录结构

c++ - 我的递归没问题吗?有没有破坏代码的例子?

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 我可以告诉VC201 0 auto 增加预编译头分配(同/Zm)而不是获取c3859吗?

c++ - 使用算法中的插入函数在空容器中插入元素未给出预期结果