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


Answers

如果可以的话,这个问题的最终解决方案是转移到C + 11统一初始化语法。

A a{};

http://www.stroustrup.com/C++11FAQ.html#uniform-init

Question

在教给我的很多东西中,被称为“最令人头痛的解析”的东西,这是经典的演示,例如

A a(B()); //declares a function

虽然这对于大多数人来说直观地看起来是A类型的对象的声明,将临时B对象作为构造函数参数,但它实际上是函数a声明,返回A ,将指针指向返回的函数B和它本身没有参数。 同样的线

A a(); //declares a function

也属于同一类别,因为它不是一个对象,而是声明一个函数。 现在,在第一种情况下,这个问题的常用解决方法是在B()周围添加一组额外的括号/括号,因为编译器会将其解释为对象的声明

A a((B())); //declares an object

但是,在第二种情况下,这样做会导致编译错误

A a(()); //compile error

我的问题是,为什么? 是的,我非常清楚正确的“解决方法”是将其更改为A a; ,但我很想知道第一个例子中extra ()为编译器做了什么,然后在第二个例子中重新应用它时不起作用。 A a((B())); 解决方法写入标准的特定异常?




你可以改为

A a(());

使用

A a=A();




Tags