【问题标题】:What's the difference between passing span<T> and std::array as arguments?将 span<T> 和 std::array 作为参数传递有什么区别?
【发布时间】:2017-01-06 19:11:38
【问题描述】:

在他的C++ Core Guidelines 中,Bjarne Stroustrup 建议在通过引用传递数组时使用 span。为什么不只传递一个 std::array 对象?

【问题讨论】:

  • 可能是为了简单和避免模板中的代码膨胀,您需要使用它来接受任何大小std::array
  • 核心指南并非由 Stroustrup 独家拥有。

标签: c++ cpp-core-guidelines


【解决方案1】:
  1. 按值传递std::array复制它们。 gsl::span 的重点在于,获取它们的函数正在引用现有的数据数组。

  2. gsl::span 能够获取运行时定义大小的数组。 std::array 在编译时固定。

  3. gsl::span 不关心数组拥有什么类型;它只是一个指针+大小。因此,基于span 的接口可以从std::vectorQVector 和许多其他类型中获取数据。基于std::array 的界面要求您使用该特定容器。

【讨论】:

  • 谢谢!同样,为什么不将开始和结束迭代器作为参数传递?
  • 因为那将是两个参数。它还要求您的函数是 template 函数。采用迭代器对的函数可以作用于各种范围,在许多情况下包括流迭代器。作用于spans 的函数只能作用于连续的值数组。
  • @JoeHuang 因为P.3: Express intent。一个 span 对象是自包含的,有两个迭代器会留下问题,它们是否相关以及如何相关。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2021-07-10
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2021-06-02
  • 2022-01-14
相关资源
最近更新 更多