2013-09-07 4 views
1

코드에서 액세스하는 POD 데이터 (예 : std::vector<T> : static_assert(std::is_floating_point<T>::value, "!");)가 포함 된 일부 코드 (STL 컨테이너)와 STL 컨테이너가 있습니다.휘발성 POD 유형의 컨테이너

분명히 volatile 한정자를 사용하여 데이터를 선언해야합니다. 내가 포인터 변환의 적절한 보정과 내 자신의 할당을 제공해야한다고,

c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\ext\new_allocator.h:110: ошибка: invalid conversion from 'volatile void*' to 'void*' [-fpermissive] 
     { ::operator delete(__p); } 

c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_construct.h:75: ошибка: invalid static_cast from type 'volatile double*' to type 'void*' 
    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); } 

c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_algobase.h:372: error: invalid conversion from 'volatile void*' to 'void*' [-fpermissive] 
     __builtin_memmove(__result, __first, sizeof(_Tp) * _Num); 
                 ^
c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\bits\stl_algobase.h:372: error: invalid conversion from 'const volatile void*' to 'const void*' [-fpermissive] 

이 유일한 해결책이다 : 그러나이 경우 GCC에는 오류를 방출?

+0

_' 명백하게 휘발성 한정자로 데이터를 선언해야합니다. 호기심을 위해서 : 그러한 구조에 대한 합리적인 유스 케이스를 지적 해 주시겠습니까? –

+0

@ g-makulik'std :: vector .data()'는 std :: vector의 요소에 액세스하기 위해 기본 레지스터의 값으로 동적으로 생성 된 코드에 전달됩니다. 승인? – Orient

+0

@ g-makulik 또는'std :: vector 'R/W의 모든 요소는 많은 스레드에서 액세스 할 수 있습니다. – Orient

답변

1

volatile의 벡터는 표준 할당자를 사용할 수 없습니다. GCC bug이 열려 있으며 GCC가 아니라 표준의 결함처럼 보입니다.

사용자가 할당자를 제공해야합니다.

1

휘발성 T *에서 T *로 캐스트해야하는 경우 const_cast (놀람, 깜짝!)를 사용해야합니다. void *로 더 캐스트하려면 static_cast 또는 reinterpret_cast가 필요합니다.

+0

즉, 'static_cast < void * > (const_cast :: :: 포인터> (_ p))'? – Orient

+0

@KDukales : 글쎄, 리바 인 (rebind)을 모르겠다. – Tomek

+0

'template struct rebind {other = xallocator를 사용하여 < U >; }}'는 일부 할당 자'xallocator' 구현의 일부인 STL 컨테이너에서 필수적입니다. – Orient