假设我有一个指向易失性数据的输入和输出指针.....我尝试在它们上使用std::copy
:
uint32_t volatile* input = /* */;
uint32_t volatile* output = /* */;
std::copy(input,input+512,output);
这会编译吗?我的想法是它应该,但它在gcc上失败,因为它试图使用需要指向非易失性数据的__builtin_memmove
......链接到godbolt:https://godbolt.org/z/6yDzqb
所以我想我的问题是:这是标准库中的错误还是允许无法编译?
是的,这应该编译。 std::copy
被指定为[alg.copy]/2以表示as if,从解除引用源范围中每个元素的迭代器获得的值被简单地分配给从解除引用迭代器到目标范围中的对应元素获得的值。 volatile std::uint32_t
可以被分配到volatile std::uint32_t
,因为volatile std::uint32_t
不是const
[basic.lval]/7。
另外,请注意这个does apparently compile在GCC的主干版本上(至少是godbolt上可用的版本)。所以我会说这几乎肯定是一个错误,现在似乎已经修复了......
除此之外,您可能需要考虑包括<cstdint>
而不是<stdint.h>
,因为C标准库头文件仅在C ++中作为不推荐的兼容性功能[depr.c.headers]提供。当你这样做时,要注意这样一个事实,即它是未指定的[requirements.headers]/4是否在这些标准头文件中声明的实体,例如std::uint32_t
,实际上是否在全局命名空间中可用。因此,你可能想考虑使用std::uint32_t
而不仅仅是uint32_t
等,因为只有前者实际上保证在那里......