오류

2013-05-20 3 views
32

나는 경우 사용자 정의에서와 같이 operator+()을 예상대로 그런 다음, 다음 작품오류

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

:

A a = A() + A(); 

하지만, g ++ - 4.7은 다음에 대한 오류 메시지를 표시합니다.

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

특히 오류 메시지는 012입니다..
(A())이 표현식에서 무시되고있는 것처럼 보입니다.

제 질문은 : A a = (A()) + A();은 컴파일해야하고 그렇지 않다면 왜 안됩니까?

참고 : 내가 #define X (Identity())을 수행하고 X + X을 시도했을 때 이런 일이 발생했습니다.

+0

흥미 롭습니다. 모르는 경우 단항 더하기 연산자 (예 : +5)로 처리됩니다. – chris

+0

@chris 이제 예제를 나누기 연산자로 변경하면 오류가 발생하지 않지만 더하기, 빼기 및 곱하기 연산자에 대해서는 오류가 발생합니다. 이 경우 바이너리 연산자 대신 단항 연산자를 구문 분석하는 것처럼 들립니다. – SirGuy

답변

46

캐스트 구문입니다.

그 이유는 캐스팅과 단항, 빼기 및 곱셈 (비 참조 연산자)이 이진 카운터보다 우선 순위가 높기 때문입니다.

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

캐스트와 unary+ 바이너리 operator+ 그렇게 표현이 이전의 의미를 걸리는 시간보다 더 높은 우선 순위를 가지고 : 흰색 공간이 여기에이 문제가되지 않기 때문에로도 읽을 수 있습니다.

내부에있는 것이 유형이 아닌 경우 어떻게 캐스팅 할 수 있는지 궁금 할 것입니다. THE MOST VEXING PARSE!을 입력하십시오. 즉, +A() 유형의 오브젝트를 0 인수를 취하고 A 유형의 오브젝트를 리턴하는 함수로 3 스트하려고합니다. 기록을 위해

, 구문은 :

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

이중 괄호가 캐스팅 될 수 없으며, 우리가 바이너리 operator+ 표현을 구문 분석에있어 있기 때문에 당신이 원하는 것을 제공합니다.

이렇게하면 나누기 연산자에 더하기 대신 문제가 발생하지 않는 이유에 대해 설명합니다. 단항 연산자가 없기 때문입니다.

+8

솔직히 더 많은 표를받을 가치가 있습니다. – chris