当有额外的括号时,在临时对象上调用用户定义的operator +时出错

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+表达式.

这也解释了为什么除法运算而不是加法运算不会出现问题,它没有一元对应物.