最烦人的解析:为什么不A(()); 工作? [c++]


Answers

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

A a{};

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

Question

教给我的许多事情是所谓的“最令人烦恼的解析”,它经典地演示了如

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

虽然这个大多数直觉似乎是a类型为A的对象a的声明,以一个临时的B对象作为构造函数参数,它实际上是a返回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