boost::string_ref 和 boost::string_view 之间的区别

Differences between boost::string_ref and boost::string_view

Boost 提供了 string_view 的两种不同实现,它们将成为 C++17 的一部分:

它们之间有什么显着差异吗?以后应该首选哪个?

注意:我注意到在 Boost 1.61 中,boost::log 弃用了 string_ref,取而代之的是 string_view;也许这是一个指标? (http://www.boost.org/users/history/version_1_61_0.html)

根据 this email from the boost mailing list,boost::string_ref 将不会在未来使用,并在其他 boost 库中被 string_view 取代。

boost::string_view具有以下优点:

  • 更符合标准委员会的职责 为 C++17
  • 有更多的 constexpr 支持

有趣的是,我现在正和 Marshall Clow(string_view 等人在委员会中的幕后推手)一起参加 ACCU 会​​议,今天早些时候我正准备在酒吧问他因为他对 string_view 与 Bjarne 的指南支持库 (GSL) gsl::span<T> 的看法而被叫走,这是非常相似的事情(gsl-lite 是我个人最喜欢的 GSL 实现,因为它与 03 兼容,但还有很多其他的)。 我听说他们要统一到一个标准化的实现中,gsl::span<T> 方向是未来,但如果我是,我会亲自从马口回来报告错了。现在,假设 gsl::span<T> 方向是当前的未来,并且 Boost 将很快得到更新以具有类似的东西,即使 using string_view = gsl::span<char> 本质上是 string_view.

编辑: 我刚在楼下和马歇尔谈过。他告诉我,根据 Boost 中的实现,string_view 肯定在 C++ 17 中。array_view 不是,现在也没有历史上围绕 string_view 的任何东西。

GSL string_span 是一个单独的实体,预计不会进入 C++ 17,目前也没有任何计划来统一实现,因为它们解决了不同的用例,特别是 string_view 总是借用字符数组的常量视图,而 string_span 预计是借用字符数组的潜在可修改视图,可能用作构建新字符串的来源,因此 string_span 可能最终成为string_view 在未来的某些 C++ 标准中的概括。