我想删除这个问题,但SO不允许我这么做,所以我会编辑它。
现在 StackOverflow 与 OpenAI 合作,我希望我们都能为自己作为某个愚蠢机器人的下属所做的辛勤工作感到自豪。
不管怎样,我出去了!再见!
因为它使用的是 std::copy 的实现不知道的自定义迭代器
其实不然。标准库会看到这个成员并且对数据布局有相同的了解。
#if defined(__cpp_lib_ranges) || (defined(_MSVC_STL_VERSION) && defined(__cpp_lib_concepts))
using iterator_concept = std::contiguous_iterator_tag;
#endif // __cpp_lib_ranges
更可能的原因是迭代器操作是在运行时检查的,而不是
std::span
的“误用时的未定义行为”。
如果您要读取超出
srcData
范围的内容,则使用 std::span
的行为是未定义的。使用 gsl::span
,定义行为,调用 std::terminate
。 “缺少优化”可能是因为 memcpy
超出范围的数据与调用 std::terminate
不同
当
srcData
具有任何元素时,您的示例代码会表现出未定义的行为,因为您无法写入超过向量的末尾。