最令人头疼的解析:为什么A a(()); 不工作?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

这是经典的演示,例如

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

扫码关注云+社区