容器具有挥发性POD类型

时间:2013-09-07 19:42:57

标签: c++ volatile dynamically-generated allocator

我有一些(比方说,动态生成的)代码和STL容器,其中包含从该代码访问的POD数据(例如,std::vector< T > static_assert(std::is_floating_point< T >::value, "!");)。

显然我需要使用volatile限定符声明数据。但在这种情况下, gcc 会发出错误:

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]

这是唯一的解决方案,我应该为我自己的分配器提供正确的指针转换校正吗?

2 个答案:

答案 0 :(得分:1)

如果你必须从volatile T *转换为T *,你需要使用const_cast(惊讶,惊喜!)。进一步强制转换为void *将需要static_cast或reinterpret_cast。

答案 1 :(得分:1)

volatile对象的向量无法与标准分配器一起使用。这里有一个GCC bug开放,它看起来像标准中的缺陷,而不是GCC。

您必须提供自己的分配器。