2011-01-03 6 views
0

이 예제는 "Thinking in C++"에서 온 것입니다. 저는 연산자 변환 함수를 합성하는 컴파일러에 관한 한 가지 질문이 있습니다. 네 클래스 객체가 전달되면합성 변환 오버로드 C++ 연산자

질문
는 은 (함수 호출에서 F()), 과부하 동작()
불린다. 하지만 나는이 변환을 달성하기 위해 컴파일러에 의해 사용 된 로직 (컴파일러가 연산 호출을 종합)을 만들 수 없다.

최대 값은 다음과 같이 명시적인 변환 동작을 기대할 수 있습니다.
1. obj3 = (3) obj4;
2. obj3 = 3 (obj4);
3. obj3 = static_cast <Three> (obj4);

이제 위의 변환 중 하나 - 컴파일러는 어떻게 합성합니까?
(세) obj4.operator()?

일부 중요한 부분이 누락되었습니다.

//: C12:Opconv.cpp 
// Op overloading conversion 

class Three { 
    int i; 
public: 
    Three(int ii = 0, int = 0) : i(ii) {} 
}; 

class Four { 
    int x; 
public: 
    Four(int xx) : x(xx) {} 
    operator Three() const { return Three(x); } 
}; 

void g(Three) {} 

int main() { 
    Four four(1); 
    g(four); 
    g(1); // Calls Three(1,0) 
} ///:~ 

답변

0

우선 class Four에는 operator()이 포함되어 있지 않지만 변환 연산자 인 operator Three()이 있습니다.

g(four); 

컴파일러 class Three의 목적에 four 변환해야하고 변환을 수행 operator Three()를 호출 synthesises 라인에

. 합성 된 변환은

g(four.operator Three()); 
1

이 먼저 당신이 제공 한 operator()하지, 그것은 operator Three입니다. 이 연산자는 class Four의 객체를 class Three의 객체로 변환하는 방법을 컴파일러에게 알려줍니다. g(four)에서 g 함수가 Three 유형의 인수를 필요로하기 때문에 호출 컴파일러는이 연산자를 사용합니다. 사용 가능한 변환이 있으므로 컴파일러가이 변환을 사용하고 있습니다. 두 번째 경우에는 Three의 생성자가 explicit으로 선언되지 않았으므로 (Three 생성자를 사용하여) 단일 정수를 사용하여 class Three의 객체를 생성 할 수 있습니다. 컴파일러는 해당 생성자를 사용하여 class Three의 객체를 생성하여 함수 g 호출 할 수 있습니다.