2016-11-02 2 views
3

문제가 발생하여 설명하기 어렵습니다. 여기에 최소한의 재현 코드는 모두 GCC 6.2 연타 3.9에 실패입니다 : 내가 T2에 T1 변환하는 특정 생성자를 작성하지 않은명시 적 사용자 정의 캐스트 연산자를 사용하는 함수 호출이 모호합니다.

class T2; 

class T1 
{ 
    int field1; 
public: 
    T1(int pf) : field1(pf) {} 
    operator int() { return field1; } 
    operator T2(); 
}; 

class T2 
{ 
    int field2; 
public: 
    T2(int pf) : field2(pf) {} 
}; 

T1::operator T2() { return T2(field1); } 

void foo(T2 pt) {} 

int main() 
{ 
    T1 obj1(1); 
    T2 obj2(2); 

    foo((T2) obj1);    // ambiguous conversion for C-style cast from 'T1' to 'T2' 
    foo(T2(obj1));    // ambiguous conversion for functional-style cast from 'T1' to 'T2' 
    foo(static_cast<T2>(obj1)); // ambiguous conversion for static_cast from 'T1' to 'T2' 
} 

참고, 그래서 그것을 모두해야 추측 유일한 방법은 사용자 정의 캐스트 연산자를 사용하는 것입니다 컴파일러에 명확.

// operator int() { return field1; } 

다음 코드는 문제없이 컴파일 :

호기심 사실은 내가 관련이 없어 보이는 캐스트 연산자를 주석 때이다. 그 이유는 무엇입니까?

+1

흥미롭게도 암시 적 캐스트 (즉, foo (obj1))가 올바르게 작동합니다. – Dmitry

+1

암시적인 @Dmitry는 암시 적 변환이 하나만 필요한 연산자 T2를 선택해야하기 때문에 작동합니다. – Danh

답변

3

(T2) obj1은 정확히 T2(obj1) (또는이 경우 static_cast<T2>(obj1))과 동일한 의미이지만,이 생성자와 유사한 구문에 대해서는 더 쉽게 추론 할 수 있습니다. int

  • 구조체 T2, T2에서 T2는 사용자 -에 의해 얻어진 구조체 int
  • 에 사용자 정의 변환 연산자에 의해 얻어진 다음 코드

    는 그대로하고, 두 가지 방법이 있습니다 N4140으로 당 T2

에 정의 변환 연산자

다른 모든 실행 가능한 기능보다 우수한 기능을 수행 할 수있는 기능이 정확히 하나있는 경우 오버플로로 선택되는 것은 입니다.

  • 사용자 정의 변환 순서 U1 더 나은 변환 순서입니다 : 다음 규칙 중 하나가 적용되지 않는 그렇지 않으면 호출은 같은 형태의

    두 암시 적 변환 시퀀스입니다 구별 변환 시퀀스를 잘못 형성된다 다른 사용자 정의 변환 시퀀스 U2 에 동일한 사용자 정의 변환 함수 또는 생성자가 포함되어 있거나 같은 집계 초기화에서 동일한 클래스를 초기화하고 두 번째 표준 변환 시퀀스 U1U2의 두 번째 표준 변환 시퀀스보다 이 좋습니다.

이 적용되지 않기 때문에는,도 변환은 다른 것보다 낫다.

+0

왜 'T2'에서 'T2'를 생성해야합니까? 왜 그 값을 직접 사용하지 않습니까? – Danh

+1

@Danh'foo '를 호출하면 문제가 난처 해집니다. 그것을 꺼내면 결과적인 'T2'값을 아무 곳이나 지나치지 않고 캐스트를 수행하기에 부적절합니다. [link] (http://melpon.org/wandbox/permlink/eZD4Y7jedPg1FwGk) – krzaq

관련 문제