最佳答案
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()));
解决方案是写入标准的特定异常吗?