Sir*_*Guy 32 c++ operator-overloading most-vexing-parse
如果我有一个用户定义operator+()
的:
class A
{
public:
A operator+(A)
{
return A();
}
};
Run Code Online (Sandbox Code Playgroud)
然后以下按预期工作:
A a = A() + A();
Run Code Online (Sandbox Code Playgroud)
但g ++ - 4.7给出了以下错误消息:
A a = (A()) + A();
Run Code Online (Sandbox Code Playgroud)
特别是错误消息是error: no match for ‘operator+’ in ‘+A()’
.
看起来(A())
在表达式中被忽略了.
我的问题是:A a = (A()) + A();
应该编译,如果没有,为什么不呢?
注意:当我这样#define X (Identity())
做时,这发生在我身上然后尝试了X + X
.
Sir*_*Guy 46
这是一种演员语法.
其原因在于,转换和一元加法,减法和乘法(取消引用运算符)具有比它们的二元对应物更高的优先级.由于这里的空白无关紧要,因此也可以理解为:
A a = (A()) +A();
Run Code Online (Sandbox Code Playgroud)
强制转换并且unary+
具有比二进制更高的优先级,operator+
因此表达式采用前者的含义.
当你内部的东西不是一个类型时,你可能想知道(就像我一样)你如何投射.进入最大的VEXING PARSE!,这意味着我试图将一个类型的对象强制转换+A()
为一个带有0个参数的函数并返回一个类型的对象A
.
对于记录,语法:
A a = ((A())) + A();
Run Code Online (Sandbox Code Playgroud)
给出你想要的东西,因为双括号不能是强制转换,我们回到解析二进制operator+
表达式.
这也解释了为什么除法运算而不是加法运算不会出现问题,它没有一元对应物.