2009-05-15 5 views
12

implicit_cast 란 무엇입니까? static_cast보다는 언제 implicit_cast를 선호해야합니까?static_cast와 Implicit_cast의 차이점은 무엇입니까?

+5

abt boost :: implicit_cast를 요청하는 경우를 대비하여; 더 분명하게 말하기 위해 글을 편집하십시오. – Abhay

+0

@Abhay'implicit_cast'의 개념은 Boost보다 훨씬 오래되었습니다 - 수년 더 오래되었습니다. – curiousguy

+0

@curiousguy : 캐스트는 항상 명시적인 변환 요청이므로 "암시 적 형변환"과 같은 것은 존재하지 않습니다. 자세한 내용은 대답을 읽으십시오 ... – Abhay

답변

18

내가 다른 곳에서 answer this comment에 작성한 댓글에서 복사 중입니다.

static_cast으로 다운 캐스트 할 수 있습니다. 그렇지 않은 경우는 implicit_cast입니다. static_cast은 기본적으로 모든 암시 적 변환을 수행 할 수 있으며 암시 적 변환의 역 (일부 제한 사항까지. 가상 기본 클래스가 관련된 경우 다운 캐스트 할 수 없음)을 허용합니다. 그러나 implicit_cast은 암시 적 변환을 허용합니다. 더 아래로 캐스트, 아니 void*->T*, 아니 U->T T는 캐스트와 변환의 차이를주의하는 것이 중요하다는 것을 U.

참고 만 명시 적으로 생성자가있는 경우. 다음에서는 캐스트가 진행되지 않습니다.

int a = 3.4; 

그러나 암시 적 변환은 double에서 int로 발생합니다. 캐스트는 항상 명시 적 변환 요청이기 때문에 "암시 적 형변환"과 같은 항목은 존재하지 않습니다. boost::implicit_cast의 이름 구조는 "암시 적 변환을 사용하여 캐스트"의 멋진 조합입니다. 이제 boost::implicit_cast의 전체 구현이 (here 설명)입니다 :

template<typename T> struct identity { typedef T type; }; 
template<typename Dst> Dst implicit_cast(typename identity<Dst>::type t) 
{ return t; } 

아이디어는 매개 변수 t에 대한 비 추론 문맥을 사용하는 것입니다.

call_const_version(implicit_cast(this)); // oops, wrong! 

무엇을 원하는 한 것은

call_const_version(implicit_cast<MyClass const*>(this)); // right! 

처럼 Dst이 이름을해야 템플릿 매개 변수를 입력 한 내용을 추론 할 수없는 컴파일러를 쓰는하기 위해서는 때문에 첫째 : 그것은 다음과 같은 함정을 피할 수 공제에 사용되는 매개 변수의 일부이기 때문에 무엇이 identity<Dst>인지 알아야합니다. 그러나 이것은 차례로 매개 변수 Dst (일부 유형에 대해 명시 적으로 특수화 될 수있는 identity)에 따라 다릅니다. 이제 우리는 순환 적 종속성을 얻었습니다. Standard는 이러한 매개 변수가 추론되지 않은 컨텍스트임을 명시하고 명시 적 템플릿 인수가 제공되어야합니다.

1

implicit_cast은 한 유형을 다른 유형으로 변환하고 내재 된 형변환 함수를 작성하여 한 유형에서 다른 유형으로 변환 할 수 있습니다.

int i = 100; 
long l = i; 

int i = 100; 
long l = implicit_cast<long>(i); 

는 다음

template <typename T> 
inline T implicit_cast (typename mpl::identity<T>::type x) 
{ 
    return x; 
} 
처럼 implicit_cast 과부하에 의해, 정확히 자신의 유형에 대한 자신의 암시 적 캐스트를 제공 할 수 있지만 동일한 코드

있습니다

여기에서 참조하십시오.더

희망 4,673,210이 또한 New C++

, static_cast의 일차적 함수가 아닌 변경 및 의미 적 변환을 수행하는 implicit_cast 약

EDIT

이 페이지는 또한 대화 도움 한 유형에서 다른 유형으로. 유형은 변경되지만 값은 동일하게 유지됩니다.

void *voidPtr = . . . 
int* intPtr = static_cast<int*>(voidPtr); 

나는이 무효 포인터를보고는 int 형 포인터 인 것처럼, 포인터가 변경되지 않습니다 원하고, 내부적으로 voidPtr는 INTPTR과 정확히 같은 값을가집니다. implicit_cast 유형이 변경되지만 변형 후의 값도 다를 수 있습니다.

+1

"_ static_cast의 기본 기능은 한 유형에서 다른 유형으로 변경 또는 의미 변환을 수행하는 것입니다.이 유형은 변경되지만 값은 동일합니다."이 경우 ('static_cast '), 값은 변경되지 않습니다. 'static_cast'는 타입과 값을 변경할 수 있습니다 : 명백한 예'static_cast (3.14)' – curiousguy

1

암시 적 변환, 명시 적 변환 및 static_cast는 모두 다릅니다. 그러나 암시 적으로 변환 할 수 있으면 명시 적으로 변환 할 수 있고 명시 적으로 변환 할 수 있으면 정적으로 변환 할 수 있습니다. 그러나 다른 방향으로 같은 것은 사실이 아닙니다. 묵시적 형변과 정적 형변환 사이에는 완벽하게 합당한 관계가 있습니다. 전자는 전자의 하위 집합입니다.

자세한

를위한 C++ 표준의 섹션 5.2.9.3

그렇지 않으면, 표현의 전자 명시 적으로 형태 static_- 캐스트 (E)의 static_cast를 사용하여 T 형의 경우로 변환 될 수 있습니다 선언 T t (e); 일부는 임시 변수 t (8.5)를 발명했기 때문에 은 올바른 형식입니다.

C++은 프로그램에서 변환을 '가시적'으로 만들기 때문에 static_casts 사용을 권장합니다. 캐스트 자체의 사용법은 한 번 볼 가치가있는 프로그래머가 적용하는 규칙을 나타내므로 static_cast를 사용하는 것이 좋습니다.

4

상황에 따라 충분하다면 implcit_cast를 선호하십시오.implicit_cast는 static_cast보다 덜 강력하고 안전합니다.

예를 들어 기본 포인터에서 파생 포인터로의 다운 캐스팅은 static_cast에서는 가능하지만 implicit_cast에서는 가능하지 않습니다. 다른 방법은 두 가지 유형 모두에서 가능합니다. 그런 다음 기본 클래스에서 파생 클래스로 캐스팅하는 경우 두 클래스를 혼동하면 안전을 유지하기 때문에 implicit_cast를 사용하십시오.

암시 적 캐리는 종종 필요하지 않습니다. implicit_cast가 수행하는 대부분의 경우에 캐스트를 사용하지 않는 것은 암시 적으로 발생합니다. implicit_cast는 과부하를 피하기 위해 표현식의 유형을 정확하게 제어해야하는 특별한 상황에서만 필요합니다.

+0

여기에는 "derived"와 "base"가 있습니다. 파생 포인터는 항상 (공개 또는 액세스 가능한) 기반으로 변환 될 수 있지만 다운 변환에는 명시 적 형변환이 필요합니다. –

+0

@ AdamH.Peterson 당신 말이 맞아요. 방금 대답을 편집했습니다. –