2016-08-20 3 views
0

A에서 B로 변환 할 때 생성자와 캐스팅 연산자를 사용하면 쉽습니다. 그러나 "중개자"가있을 때 세 번째 유형은 생성자 초기화와 함께 작동하거나 한 유형을 다른 유형과 동일시 할 때도 있지만 함수 호출에서 전달되는 매개 변수는 작동하지 않는 것 같습니다.함수를 호출 할 때 간접 형 변환이 지원되지 않습니까?

내 질문 : C++에서 지원되지 않는 것입니까, 아니면 놓친 것이 있습니까? 아래 코드에서 내 3 개의 댓글을 참조하십시오. (VS2015 업데이트 3의 컴파일러를 사용하고 있습니다.)

class StringOut 
{ 
public: 
    char* ptr = nullptr; 
    StringOut() {} 
    operator char*() { return ptr; } 
}; 

class StringIn 
{ 
public: 
    char* ptr = nullptr; 
    StringIn() {} 
    StringIn(char* ptr) { StringIn::ptr = ptr; } 
    void operator=(char* ptr) { StringIn::ptr = ptr; } 
    //StringIn(StringOut& ptr) { StringIn::ptr = ptr.ptr; } 
}; 

void ff1(StringIn strin) 
{ 

} 

void ff1(int a) 
{ 

} 

void ff() 
{ 
    StringOut strout; 
    StringIn strin = strout; // compiles 
    strin = strout; // compiles 

    ff1(strout); // doesn't compile 
}; 

확실히 주석 처리 된 코드를 사용하면 작업 할 수 있습니다. 하지만 내 질문은 그것이 C++의 한계라면 이것과 같은 직접 연산자가 필요하거나 뭔가 놓치겠습니까?

+1

확실히 컴파일러는 "컴파일하지 않습니다"라고 말했습니다. –

+0

생성자 초기화에서 '중매인'캐스트가 작동한다고 믿는 근거는 무엇입니까? 여기에는 아무것도 나와 있지 않습니다. – EJP

+0

'StringInstrin = strout; '과 같은 코드는 생성자 유형 초기화이며'StringInstrin (strout);과 동일합니다. – Thomas

답변

2

자동 변환은 '한 걸음'으로 완료됩니다. 두 단계를 허용하면 컴파일러의 작업을 관리하기 어려울 정도로 극도로 어렵게 만들뿐만 아니라, 너무 많은 변형이 발생하기 쉽고 어떤 것을 선택해야할지 불분명하지만 인간이 어떤 일이 발생하는지 거의 이해할 수 없게 만듭니다.

그렇습니다. 이는 언어 정의에서 의도적 인 제한 사항입니다.

+0

사실,이 제한에 만족합니다. 단지 이중 확인하고 싶었습니다. 답변 감사합니다! – Thomas

관련 문제