implicit_cast 란 무엇입니까? static_cast보다는 언제 implicit_cast를 선호해야합니까?static_cast와 Implicit_cast의 차이점은 무엇입니까?
답변
내가 다른 곳에서 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는 이러한 매개 변수가 추론되지 않은 컨텍스트임을 명시하고 명시 적 템플릿 인수가 제공되어야합니다.
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 유형이 변경되지만 변형 후의 값도 다를 수 있습니다.
"_ static_cast의 기본 기능은 한 유형에서 다른 유형으로 변경 또는 의미 변환을 수행하는 것입니다.이 유형은 변경되지만 값은 동일합니다."이 경우 ('static_cast
암시 적 변환, 명시 적 변환 및 static_cast는 모두 다릅니다. 그러나 암시 적으로 변환 할 수 있으면 명시 적으로 변환 할 수 있고 명시 적으로 변환 할 수 있으면 정적으로 변환 할 수 있습니다. 그러나 다른 방향으로 같은 것은 사실이 아닙니다. 묵시적 형변과 정적 형변환 사이에는 완벽하게 합당한 관계가 있습니다. 전자는 전자의 하위 집합입니다.
자세한
를위한 C++ 표준의 섹션 5.2.9.3그렇지 않으면, 표현의 전자 명시 적으로 형태 static_- 캐스트 (E)의 static_cast를 사용하여 T 형의 경우로 변환 될 수 있습니다 선언 T t (e); 일부는 임시 변수 t (8.5)를 발명했기 때문에 은 올바른 형식입니다.
C++은 프로그램에서 변환을 '가시적'으로 만들기 때문에 static_casts 사용을 권장합니다. 캐스트 자체의 사용법은 한 번 볼 가치가있는 프로그래머가 적용하는 규칙을 나타내므로 static_cast를 사용하는 것이 좋습니다.
상황에 따라 충분하다면 implcit_cast를 선호하십시오.implicit_cast는 static_cast보다 덜 강력하고 안전합니다.
예를 들어 기본 포인터에서 파생 포인터로의 다운 캐스팅은 static_cast에서는 가능하지만 implicit_cast에서는 가능하지 않습니다. 다른 방법은 두 가지 유형 모두에서 가능합니다. 그런 다음 기본 클래스에서 파생 클래스로 캐스팅하는 경우 두 클래스를 혼동하면 안전을 유지하기 때문에 implicit_cast를 사용하십시오.
암시 적 캐리는 종종 필요하지 않습니다. implicit_cast가 수행하는 대부분의 경우에 캐스트를 사용하지 않는 것은 암시 적으로 발생합니다. implicit_cast는 과부하를 피하기 위해 표현식의 유형을 정확하게 제어해야하는 특별한 상황에서만 필요합니다.
여기에는 "derived"와 "base"가 있습니다. 파생 포인터는 항상 (공개 또는 액세스 가능한) 기반으로 변환 될 수 있지만 다운 변환에는 명시 적 형변환이 필요합니다. –
@ AdamH.Peterson 당신 말이 맞아요. 방금 대답을 편집했습니다. –
abt boost :: implicit_cast를 요청하는 경우를 대비하여; 더 분명하게 말하기 위해 글을 편집하십시오. – Abhay
@Abhay'implicit_cast'의 개념은 Boost보다 훨씬 오래되었습니다 - 수년 더 오래되었습니다. – curiousguy
@curiousguy : 캐스트는 항상 명시적인 변환 요청이므로 "암시 적 형변환"과 같은 것은 존재하지 않습니다. 자세한 내용은 대답을 읽으십시오 ... – Abhay