【问题标题】:gsl::span - pointer to endgsl::span - 指向结束的指针
【发布时间】:2018-02-16 04:42:44
【问题描述】:

我需要将一个 gsl::span 传递给一个函数,该函数需要一个指向开始的指针和一个指向结束的指针。我更新了函数以使用 gsl::span 以避免不使用指针算术警告。那么如何获得指向末尾的指针呢?

我正在尝试调用 std::ctype::widen。我使用什么神奇的咒语来获取 std::ctype::widen 函数的 end 参数的值?

我尝试了以下方法。

&(*str.cend())

我也尝试了以下方法。

&str[srcLen]

两者都会导致崩溃。

我可以尝试以下方法,但这只会导致我一开始试图解决的警告。

str.data() + str.length()

我开始认为整个 C++ 核心指南和指南支持库考虑得太差,不值得付出努力。这是我第二次遇到“gsl 导致我最初尝试解决的确切警告”问题。

【问题讨论】:

  • 如果您"更新了函数以使用 gsl::span",为什么还需要指向末尾的指针?
  • 请显示触发警告的minimal reproducible example。

标签: c++ cpp-core-guidelines guideline-support-library


【解决方案1】:

span 与大多数 C++ 库一样,旨在与接受模板迭代器的代码一起使用。您可以将begin/end 传递给算法或其他容器等。

当您必须处理纯粹基于特定迭代器对(如指针)的接口时,此类 API 几乎无法正常工作。这与试图获取指向std::vector 末尾的指针没有什么不同;你迟早要进行指针运算。

但是,如果您对指针运算的警告感到恼火,请尝试使用std::next(str.data(), str.size()) 来计算结束指针。静态分析工具可能会抱怨这一点,但它确实不应该。

【讨论】:

  • @Galik:是的,类似的。
  • 问题是我正在调用一个期望原始指针结束的函数。 std::next 返回一个迭代器。此外,gsl::span 已经有一个 end 函数,它返回一个迭代器到 span 的末尾。问题是我正在调用一个我无法控制的函数,它需要一个指向结束的指针。
  • @BenKey: std::next 返回与其第一个参数相同的类型。原始指针是迭代器。 data 返回一个原始指针。因此,std::next(str.data(), str.siz()) 将返回一个指向列表末尾的原始指针。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2016-03-21
  • 2012-03-28
相关资源
最近更新 更多