암시 적 변환 멤버가 반환 유형별로 작업을 과부하하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1128501

문제

C ++는 리턴 유형에 기초한 방법에 대해 다형성을 허용하지 않습니다. 그러나 암시 적 변환 멤버 기능을 과부하시킬 때 이것은 가능해 보입니다.

왜 그런지 아는 사람이 있습니까? 나는 운영자가 내부적으로 방법처럼 처리된다고 생각했다.

편집 : 예는 다음과 같습니다.

struct func {
    operator string() { return "1";}
    operator int() { return 2; }
};

int main( ) {
    int x    = func(); // calls int version
    string y = func(); // calls string version
    double d = func(); // calls int version
    cout << func() << endl; // calls int version
}
도움이 되었습니까?

해결책

전환 연산자는 실제로 다른 과부하로 간주되지 않으며 그들의 반환 유형. 컴파일러는 컴파일러가 사용하면 만 사용합니다 해야합니다 (유형이 호환되지 않고 변환되어야하는 경우) 또는 캐스트 연산자와 함께 그 중 하나를 사용하도록 명시 적으로 요청한 경우.

의미 적으로 코드가하는 일은 여러 가지를 선언하는 것입니다. 다른 변환 연산자를 입력하십시오 단일 연산자의 과부하가 아닙니다.

다른 팁

그것은 반환 유형이 아닙니다. 그것은 유형 변환입니다.

고려 : func ()는 type func의 객체를 만듭니다. 어떤 방법 (생성자)이 호출 될에 대한 모호성이 없습니다.

남아있는 유일한 질문은 원하는 유형에 캐스팅 할 수있는 경우입니다. 컴파일러에 적절한 변환을 제공 했으므로 행복합니다.

결과 유형에서 기능의 과부하를 방지 할 기술적 인 이유는 실제로 없습니다. 이것은 예를 들어 ADA와 같은 일부 언어로 이루어 지지만 C ++의 맥락에서 암시 적 변환 (및 두 종류의 두 종류)의 맥락에서 유틸리티가 줄어들고 두 기능의 상호 작용은 빠르게 모호성으로 이어집니다.

결과 유형에서 과부하를 시뮬레이션하기 위해 암시 적 변환이 사용자 정의 가능하다는 사실을 사용할 수 있습니다.

class CallFProxy;
CallFProxy f(int);

class CallFProxy {
   int myParameter;
   CallFProxy(int i) : myParameter(i) {}
public:
   operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
   operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};

오버로드 해상도는 여러 후보 기능 중에서 선택합니다. 이 과정에서 후보자의 반환 유형은 실제로 고려되지 않습니다. 그러나 변환 연산자의 경우 "반환 유형"은 해당 연산자가 후보인지 여부를 결정하는 데 매우 중요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top