32 votes

Erreur lors de l'appel de l'utilisateur défini par l'opérateur+ sur l'objet temporaire lorsqu'il y a entre parenthèses supplémentaires

Si j'ai un définis par l'utilisateur operator+() comme dans:

    class A
    {
    public:
        A operator+(A)
        {
            return A();
        }
    };

Puis le suivant fonctionne comme prévu:

    A a = A() + A();

mais g++-4.7 donne un message d'erreur suivantes:

    A a = (A()) + A();

Le message d'erreur en particulier, est - error: no match for ‘operator+' in ‘+A()'.
Il ressemble à l' (A()) est ignorée dans l'expression.

Ma question est: est - A a = (A()) + A(); censé compiler et si non, pourquoi pas?

Remarque: cétait pour moi, quand je n' #define X (Identity()) , puis a essayé de faire X + X.

46voto

GuyGreer Points 4240

C'est une fonte de la syntaxe.

La raison en est que le casting et les unaire d'addition, de soustraction et de multiplication (de l'opérateur de déréférencement) ont une priorité plus élevée que leurs binaire homologues. Depuis les espaces en blanc, ici, n'a pas d'importance ce peut aussi être lu comme suit:

    A a = (A()) +A();

La distribution et de l' unary+ ont une priorité plus élevée que le binaire operator+ donc l'expression prend l'ancien sens.

Vous demandez peut-être (comme moi) comment vous pouvez voter lorsque la chose à l'intérieur n'est pas un type. Entrez LA PLUS DÉLICATE à ANALYSER!, ce qui signifie que je suis en train de jeter un objet de type +A() pour une fonction prenant 0 arguments et retourne un objet de type A.

Pour l'enregistrement, la syntaxe:

    A a = ((A())) + A();

donne ce que vous voulez depuis le double crochets ne peut pas être un casting et nous sommes de retour à l'analyse du binaire operator+ expression.

Cela explique aussi pourquoi le problème ne se produit pas avec l'opérateur de division au lieu de l'addition, il n'a pas unaire homologue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X