如何使用std span进行边界检查



std::vector和几乎所有其他容器都有一种非常方便的边界检查方法:at()std::span显然没有。

  • 为什么
  • 有替代品吗?除了推出自己的at()之外

相当笨重,但类似于以下内容:

  1. 使用位置
template<class Container>
auto& at(Container&& c, std::size_t pos){
if(pos >= c.size())
throw std::out_of_range("out of bounds");
return c[pos];
}
  1. 使用迭代器:
template<class Iterator, class Container>
auto& at(Container&& c, Iterator&& it){
if(std::distance(c.begin(), it) >= c.size())
throw std::out_of_range("out of bounds");
return *it;
}

将span引入标准库的论文说:

范围检查和边界安全

对跨度封装的数据的所有访问都在概念上进行了范围检查,以确保它们保持不变在跨度的范围内。由于在运行时未能满足span的边界安全约束,实际发生的是未定义的行为。

也就是说,操作具有狭窄的契约,为实现者提供了自由。

如果您的标准库不允许您将行为控制到适当的粒度。gsl-lite提供了可配置的违反合同行为的替换。微软GSL以前是可配置的,但现在总是在违反合同时终止,在这里讨论(这可能实际上是你想要的(。

相关内容

  • 没有找到相关文章

最新更新