2013-05-20 12 views
32

Jeśli mam zdefiniowana przez użytkownika operator+() jak w:Błąd wywołanie zdefiniowanej przez użytkownika operatora + na tymczasowego obiektu, gdy istnieją dodatkowe wsporniki

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

wówczas następujących robót zgodnie z oczekiwaniami:

A a = A() + A(); 

ale g ++ - 4.7 wyświetla komunikat o błędzie:

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

W szczególności komunikat o błędzie error: no match for ‘operator+’ in ‘+A()’.
Wygląda na to, że wyrażenie (A()) jest ignorowane.

Moje pytanie brzmi: czy A a = (A()) + A(); ma się skompilować, a jeśli nie, dlaczego nie?

Uwaga: przydarzyło mi się, gdy robiłem #define X (Identity()), a następnie próbowałem wykonać X + X.

+0

Interesujące. Jeśli nie wiesz, to jest traktowane jako jednoargumentowy operator plus, na przykład +5. – chris

+0

@chris Teraz, gdy o tym wspomnisz, błąd nie występuje, jeśli zmienisz przykład do operatora podziału, ale robi to dla operatorów dodawania, odejmowania i mnożenia. Wygląda na to, że w tym przypadku analizowane są jednoargumentowe operatory zamiast binarnych. – SirGuy

Odpowiedz

46

To jest składnia obsada.

Powodem tego jest to, że rzucanie i jednoargumentowe dodawanie, odejmowanie i mnożenie (operator dereferencyjny) mają wyższy priorytet niż ich binarne odpowiedniki. Ponieważ białe przestrzenie tutaj nie ma znaczenia to można także odczytać jako:

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

Obsada i unary+ mają wyższy priorytet niż binarny operator+ więc wyrażenie zajmuje dawny sens.

Może zastanawiasz się (tak jak ja), jak możesz rzucać, gdy rzecz wewnątrz nie jest typem. Wpisz THE MOST VEXING PARSE!, co oznacza, że ​​próbuję rzucić obiekt typu +A() do funkcji pobierającej 0 argumentów i zwracającej obiekt typu A.

Dla przypomnienia, składnia:

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

daje to, co chcesz, ponieważ podwójne wsporniki nie mogą być odlewane i wracamy do analizowania binarne operator+ wyraz.

To wyjaśnia również, dlaczego problem nie występuje z operatorem podziału zamiast dodawania, nie ma jednorzędnego odpowiednika.

+8

To zasługuje na więcej głosów, szczerze. – chris

Powiązane problemy