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++ 表达式,而()
不是。
要了解有关如何定义语言以及编译器如何工作的更多信息,您应该了解形式语言理论或者更具体地说上下文无关语法 (CFG)以及有限状态机等相关材料。如果您对此感兴趣,尽管维基百科页面还不够,但您必须买一本书。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)