2013-10-10 4 views
11

에 대한 static_cast 및 reinterpret_cast 누군가 캐스팅에 관한 코드를 약간 설명해주세요. http://en.cppreference.com/w/cpp/types/aligned_storage?std :: aligned_storage

다음 코드

return *static_cast<const T*>(static_cast<const void*>(&data[pos])); 

return *reinterpret_cast<const T*>(&data[pos]); 

로 대체 할 수 있습니까?

왜 여기에 두 개의 주조가 사용됩니까? 고마워요. 표준에 따르면 홍

+1

이것은'reinterpret_cast'의 결과가 표준에서 지정되지 않았기 때문에 적절한 이식성/표준 적합성에 필요한 것으로 의심됩니다. 실제로 그들은 모든 또는 거의 모든 구현에서 동일한 작업을 수행합니다. –

+2

둘은 C++ 11에서 동일합니다. – Simple

+0

@SteveJessop : 대답이라고 생각합니다. –

답변

5

(5.2.10 reinterpret_cast 부 7 §)

오브젝트 포인터가 명시 적 디 FF 서로 다른 오브젝트 유형에 대한 포인터로 전환시킬 수있다. prvalue "T1 포인터"유형의 v이 유형 "cv T2 포인터"로 변환 될 때, 결과는 static_cast<cv T2*>(static_cast<cv void*>(v))모두 T1T2 표준 레이아웃 유형은 다음과 T2의 정렬 요구 사항은 T1보다 더 엄격한없는 경우 .

"T2 포인터"형태로 "T1 포인터 '유형의 prvalue 변환에 뒤로 (T1T2 개체 유형이며 T2의 정렬 조건은 더 T1보다 엄격한없는 경우)의 원래 유형은 원래 포인터 값을 산출합니다. 다른 포인터 변환의 결과는 지정되지 않습니다.

그래서, 우리는 다음과 같은 결론을 만들 수 : static_cast<*T>(static_cast<void*>(ptr))

  • static_cast<>(ptr)

    1. reinterpret_cast<*T>(ptr)이 eqiuvalent 것은 항상 ptr 동일하지 않습니다,하지만 reinterpret_cast<>(ptr) 항상 ptr
    2. 동일한 경우가 정렬 문제가 없으므로 reinterpret_cast을 안전하게 사용할 수 있습니다.