C++

2015-02-05 6 views
4

다음 프로그램을 고려 변환 연산자 대 연산자 과부하 비교 우선 순위 : USE_COMPARE 정의 할 때, if (f<m)의 비교 연산자 비교 과부하를 사용C++

#include <iostream> 

using namespace std; 

class Foo { 
public: 
    int k; 

    operator int() { 
     cout << "convert int" << endl; 
     return k; 
    } 

#if USE_COMPARE 
    bool operator < (int rhs) { 
     cout << "compare with" << endl; 
     return (k < rhs); 
    } 
#endif 
}; 

int main() 
{ 
    Foo f; 
    f.k = 3; 
    int m = 5; 


    if (f < m) { 
     cout << 1 << endl; 
     return 1; 
    } 
    cout << 0 << endl; 
    return 0; 
} 

. USE_COMPARE이 정의되어 있지 않으면 fFoo에서 int으로 변환 한 다음 정수를 비교합니다. 비교 연산자 오버로드는 변환 연산자보다 우선 순위가 높습니다. C++ 표준 관점에서 이것을 확인할 수 있습니까?

그러나 비교 연산자가 우선해야한다고 생각합니다. 그러나 C++ 표준의 관점에서 질문에 대답하십시오.

감사합니다.

답변

3

13.3.3.2/2

(13.3.3.1에 정의 등) 암시 적 변환 시퀀스의 기본 형태를 비교하면

표준 변환 시퀀스 (13.3.3.1.1)가 인 더 변환 사용자 정의 변환 시퀀스 또는 생략 변환 시퀀스와 시퀀스 및

사용자 정의 변환 시퀀스 (13.3.3.1.2)는 더 나은 변환이다,536,913,632 10 시퀀스는 줄임표 변환 시퀀스 (13.3.3.1.3)보다 길다.

13.3.3.1/3

잘 형성된 암시 적 변환 시퀀스는 다음 형태의 하나이다 : - 표준 변환 시퀀스 (13.3.3.1.1)

- 사용자 정의 변환 시퀀스 (13.3.3.1.2) 또는

- 줄임표 변환 시퀀스 (13.3.3.1.3).

에는 변환이 매개 변수 유형에 인수를 일치 할 필요가 없다면 13.3.3.1/8

는 암시 적 변환 순서는 신분 전환 (13.3 구성된 표준 변환 순서입니다. 3.1.1).

13.3.3.1.2/1

사용자 정의 변환 시퀀스는 사용자 - 정의 된 변환 한 다음 초기 표준 변환 시퀀스 구성 (12.3) 번째 표준 변환 뒤에 순서. 변환 함수 (12.3.2)로 사용자 정의 변환을 지정하면 초기 표준 변환 시퀀스는 소스 유형을 변환 함수의 암시 적 객체 매개 변수로 변환합니다.비교 연산자가 정의되어있는 경우

는, 컴파일러에 대한 두 가지 변종이 있습니다

1)하자

IF = Identity(f) 

전화 :

IF.operator <(int) 

2)하자

IF = Identity(f); 
converted_int = Identity(IF.operator int()); 

전화 :

operator < (converted_int, int); 

암시 적 변환 순서는 사용자 전환 순서보다 낫다. 큰 따옴표를위한 과부하 해결에 관한 표준에는 두 가지 단어가 있습니다. 단 13.3 또는 13.3.3 [over.best.ics] 만 읽을 수 있습니다.

+0

하지만 분명히'<'연산자 오버로드를 정의 했으므로 변환이 필요 없기 때문에 연산자 오버로드를 사용해야합니다. 맞습니까? –

+0

@Robin Hsu, 이것은 실제로 답변으로 작성되었습니다. – ForEveR

+0

당신은 두 가지 차이가 ​​존재한다고 말하고있는 것 같습니다. 두 가지 모두 합법적이고 일부 컴파일러는 이것을하고 다른 것은 그렇게한다는 것을 의미합니까? 아니면 더 설명해 주시고 가난한 영어를 용서해 주시겠습니까? (또는 가난한 C++ :-)) –