2012-09-09 5 views
6

은의이 코드 보자 : 나는 믿고C++ : 대 변환 생성자 우선 순위 대 할당 연산자 캐스트 연산자

Test1 t1; 
Test2 t2; 
t1 = t2; 

가에 t1 = t2

  • 를 구현하는 방법을 세 가지 방법이다 (이상?) Test1
  • 에 과부하 할당 연산자는 Test1(const Test2&)을 만들 Test2
  • 에 타입 캐스트 연산자를 오버로드 내 GCC 테스트에 따르면 변환 생성자는

이 사용하는 것의 우선 순위 :

  1. 할당 연산자
  2. 변환 생성자와 타입 캐스트 연산자 (모호한)
  3. const를 변환 생성자 const 유형 캐스트 ​​연산자 (모호함)

이 우선 순위를 이해하는 데 도움을 주시기 바랍니다.

t1.operator=(t2); 

지금 오버로드 확인의 일반적인 규칙이 적용

나는 테스트를위한 코드 (사용해 몇 줄의 주석)

struct Test2; 
struct Test1 { 
    Test1() { } 
    Test1(const Test2& t) { puts("const constructor wins"); } 
// Test1(Test2& t) { puts("constructor wins"); } 
// Test1& operator=(Test2& t) { puts("assign wins"); } 
}; 

struct Test2 { 
    Test2() { } 
// operator Test1() const { puts("const cast wins"); return Test1(); } 
// operator Test1() { puts("cast wins"); return Test1(); } 
}; 


int main() { 
    Test1 t1; 
    Test2 t2; 
    t1 = t2; 
    return 0; 
} 
+0

'Test1 :: Test1 (const Test2 &)'는 "복사 생성자"가 아니며 "변환 생성자"입니다. – aschepler

+0

이 게시물은 변환 연산자가 더 높은 우선 순위를 갖는 이유를 정확히 설명합니다. http://stackoverflow.com/questions/1384007/conversion-constructor-vs-conversion-operator-precedence –

답변

13

t1 = t2;은 동일합니다을 사용합니다. 직접 일치하는 항목이 있으면 그 항목이 선택됩니다. 그렇지 않으면 암시 적 변환이 (자동으로 생성 된 "암시 적으로 정의 된") 복사 할당 연산자와 함께 사용되는 것으로 간주됩니다.

두 가지 암시 적 사용자 정의 변환이 가능합니다. 모든 사용자 정의 전환 동일한 카운트 모두가 정의되는 경우, 오버로드가 모호 다음 Test1::Test1(Test2 const &) 변환 생성자 통해 Test1

  • t2 변환한다.

  • 캐스트 연산자 Test2::operator Test1() const을 통해 t2Test1으로 변환하십시오.

+0

@ Luchian의 두 번째 ideone 예제에서 변환 함수가 이기기 때문에 'Test2 &'를'const Test2 &'가 아닌't2'에 바인딩합니다. http://ideone.com/U38vK도 모호한 것으로 생각했지만 g ++이 생성자를 선호하는 것 같습니다. – aschepler

+2

아하. g ++에서는'-pedantic'을 요구할 때 모호한 것을 호출합니다. Naughty default g ++. – aschepler

+0

@KerrekSB : 캐스트 연산자가 상수가 아닌 경우 변환 생성자보다 우위에 있으며 모호성이 없습니다. http://liveworkspace.org/code/7795254ae49b4d6350f0ede57615e4c6 –