假设我有一个指向易失性data.and的输入和输出指针,我尝试对它们使用std::copy:
uint32_t volatile* input = /* */;
uint32_t volatile* output = /* */;
std::copy(input,input+512,output);这应该编译吗?我的想法是它应该这样做,但它在gcc身上失败了,因为它试图使用__builtin_memmove,这需要指向非易失性data.link的指针才能指向godbolt:https://godbolt.org/z/6yDzqb
所以我想我的问题是:这是标准库中的一个bug,还是允许它无法编译?
发布于 2019-04-23 10:43:31
是的,这应该会被编译。std::copy被指定为[alg.copy]/2 to behave as if通过将迭代器解引用到源范围中的每个元素而获得的值被简单地分配给通过将迭代器解引用到目标范围中的相应元素而获得的值。可以将volatile std::uint32_t分配给volatile std::uint32_t,因为volatile std::uint32_t不是const [basic.lval]/7。
另外,请注意在主干版本的GCC上的这个does apparently compile (至少是在龙箭上可用的那个)。所以我想说这几乎肯定是个bug,现在它似乎已经被修复了…
除此之外,您可能想要考虑包括<cstdint>而不是<stdint.h>,因为C标准库头只在C++中作为一个不推荐使用的兼容性特性[depr.c.headers]提供。这样做时,请注意这样一个事实,即在这些标准标头中声明的实体(如std::uint32_t )是否在全局名称空间中实际可用是未指定的( [requirements.headers]/4 )。因此,您可能需要考虑使用std::uint32_t而不只是uint32_t等,因为只有前者才能实际保证存在…
https://stackoverflow.com/questions/55803461
复制相似问题