我有一些(比方说,动态生成的)代码和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]
这是唯一的解决方案,我应该为我自己的分配器提供正确的指针转换校正吗?
答案 0 :(得分:1)
如果你必须从volatile T *转换为T *,你需要使用const_cast(惊讶,惊喜!)。进一步强制转换为void *将需要static_cast或reinterpret_cast。
答案 1 :(得分:1)
volatile
对象的向量无法与标准分配器一起使用。这里有一个GCC bug开放,它看起来像标准中的缺陷,而不是GCC。
您必须提供自己的分配器。