2010-01-25 5 views
1

네, 이식성이 좋지 않습니다. 왜 이런 식으로하고 싶은지 궁금합니다 :`그게 무슨 뜻입니까? reinterpret_cast <char *&> (a) = cp;

char *cp ; 
reinterpret_cast<char *&>(a) = cp; 

`그리고 그것이 의미하는 것은 무엇입니까?

Thx

+0

cp 유형을 게시 할 수 있습니까? – JaredPar

+0

@ Jared : 아마도'char *'일 것입니다. 그렇지 않으면 작동하지 않을 것입니다. – GManNickG

+0

예제를 업데이트했지만 형식은 중요하지 않습니다. – vehomzzz

답변

2

achar*&에 주조된다. 비트가 캐스트 대상 유형에 의해 요청 된 방식으로 정확하게 재 해석되기 때문에 reinterpret_cast이라고합니다. 컴파일러는 유효성을 검사하지 않으며 (가능하지도 않습니다). 포인터가 메모리의 원래 주소로 되돌아갑니다. 메모리의 주소 일뿐입니다.

a이 포인터에 대한 참조로 캐스트 된 이유는 cp에 할당 할 유효한 lvalue를 갖는 참조가 필요하기 때문입니다. reinterpret_cast<char *>(a) = cp은 임시로 할당 할 수 없으므로 불법입니다.

소스 코드가 약간 엉망입니다. 이 하나 더 오래 비록

char* c = reinterpret_cast<char*>(a); 
c = cp; 

은 유지하고 읽을 아마도 더 나은 (우리가 캐스트의 결과를 저장하기 위해 별도의 변수 c을 도입하고 있기 때문에 정확히 같은 의미는 아니다주의 원래의 샘플에서. , a의 메모리가 새 위치 cp을 가리 키기 위해 다시 사용됩니다.

+1

아마도 같은 의미는 아닙니다. 질문의 코드에서'a'의 값은를 가리키고, 반면에 당신의 코드에서는'a'의 값은 변하지 않습니다. 코드를 읽기 쉽고 의미를 유지하는 방법은 실제로 포인터 유형 'a'('a'는'T * '라고 가정)로 변환합니다 :'a = reinterpret_cast (cp);'. RHS에서의 캐스팅은 lvalue reference를 필요로하지 않으며, 단순한 rvalue로 충분하므로 '&'를 제거 할 수 있습니다. –

+0

네 말이 맞아, 내 발췌 문장이 잘못되었다. 내 설명에 맞게 편집했습니다. 너의 것이 최선의 방법이다. –

0

일부 사람들은 캐스트에 대한 참조를 혼동합니다. 기준이 없다면, 우리는이 같은 것이다 :

T a; // whatever a is, we don't know 
char* cp; // or something convertible to char* 

// remember, this is not what actually gets generated 
char* some_temporary_rvalue = reinterpret_cast<char*>(a); 
some_temporary_rvalue = cp; // illegal, and senseless 

기준으로를, 그것은된다 :

T a; // whatever a is, we don't know 
char* cp; // or something convertible to char* 

char*& a_treated_as_charptr = reinterpret_cast<char*&>(a); 
a_treated_as_charptr = cp; // assigns a char* that is at &a 
+0

왜 'a_treated_as_charptr'은 임시 참조를하지 않습니까? 또는 임시로 범위를 유지하는 참조입니까? –

+0

그리고 왜 우리는'a '를'* &'로 캐스팅해야합니까? 왜 우리는 단지 다음과 같이 말할 수 없는가? 'char * & a_treated_as_charptr = reinterpret_cast (a);'? –

+0

STingRay : 'renterpret_cast'가 rvalue를 생성하지 못하도록하는 캐스트의 참조입니다. 참고 문헌으로 "이 유형의 기억 영역을 치료하십시오"라고 말합니다. "이 유형의 메모리로이 영역의 가치를 취급하십시오."사실 두 번째 설명은 불법이며 컴파일되지 않습니다. 임시 변수에 대한 참조를 할당 할 수 있습니다. (내 게시물에서와 같은 과정을 시도해보십시오. 당신은'char * & a_treated_as_charptr = some_temporary_rvalue'라고 말할 것입니다. – GManNickG

-1

흥미로운 부분 질문에서 누락 된 것은 a의 유형입니다. 나는 그것이 어떤 종류의 포인터라고 가정 할 수있다. (그것은 실제로 아무것도 될 수 있지만, 그 가정은 토론을 더 단순하게 만든다.) a 다른 유형에 대한 포인터가 사실이라는 가정하에

T *a; 
char* p = "Hello"; 
reinterpret_cast<char*&>(a) = p; 

, 작업의 결과에 해당 될 것이다 :

T *a; 
char *p = "Hello"; 
a = reinterpret_cast<T*>(p); // convert p to a T* and assign 

첫 번째 버전에서, 캐스트인지되는 차이 할당의 왼쪽 (LHS)에서 수행되므로 참조 (왼쪽 값)에 대한 형 변환이어야하며 두 번째 경우에서는 오른쪽 (RHS)에서 형 변환이 수행되므로 rvalue가 충분하고 거기에서 참조로 전송할 필요가 없습니다.

이제 일반 경우에는 두 가지 캐스트에 차이가 있습니다. 캐스팅을 다시 해석하면 메모리를 해당 유형으로 재 해석합니다. achar*의 유형이 동일한 크기 (위의 가정하에 모든 포인터의 크기가 동일 함) 인 경우 두 작업은 동일하며 동일한 결과를 산출합니다.

반면에 한 유형이 다른 유형보다 크면 두 조작이 동일하지 않습니다. sizeof(a) > sizeof(char*) 첫 번째 버전은 변수를 다시 해석하고 바이트의 ap 값으로 덮어 씁니다.두 번째 경우에는 p의 메모리 위치에서 sizeof(a) 바이트가 읽히고 (변수에서 읽히지 않으므로 정의되지 않은 동작이 발생 함)이 바이트를 복사하여 a의 이전 바이트를 모두 덮어 씁니다. 두 번째 p 상기 제 sizeof(a) 바이트 a을 덮어 반면 sizeof(a) < sizeof(char*) 후 최초 버전이 정의되지 않은 행동을 유발 a 위해 할당 된 공간을 넘어 덮어 경우

반대 간다.

관련 문제