为什么std :: string_view不具有Assign()和clear()方法?

时间:2019-01-24 11:53:36

标签: c++ stl string-view

对我来说,这些方法的实现似乎很简单,它们将使std::stringstd::string_view的用法更加可互换。毕竟,std::string_view具有构造函数,这些构造函数使对象保持与这些方法相同的状态。一个人可以解决这样的丢失方法:

std::string s {"abcd"};
std::string_view v {s.c_str()};
std::cout << "ctor:   " << v << std::endl; // "abcd"
v = {s.c_str() + 1, 2};
std::cout << "assign: " << v << std::endl; // "bc"
v = {nullptr}; // or even v = {};
std::cout << "clear:  " << v << std::endl; // ""

那么,在标准中不包括这两种明显方法的原因是什么?

更新: 您的评论中的一个普遍问题似乎是“有什么意义?”,所以我给您提供一些背景信息。我正在解析一个大字符串,结果是子字符串的结构。该结果结构是字符串视图的自然候选者,因此我不必复制所有那些甚至重叠的字符串。结果的一部分是映射到字符串视图,因此我可能需要在获取键时将它们构造为空,并在稍后获得值时将其填充。解析时,我需要跟踪中间字符串,这涉及更新和重置它们。现在它们也可以用字符串视图替换,这就是我在那些缺少的函数上发生的事情。当然,我可以继续使用字符串,或用普通的旧ptr-ptr或ptr-size对替换它们,但这正是std::string_view的目的,对吧?

3 个答案:

答案 0 :(得分:5)

std::string接口因其blown API而享有声誉,这就是为什么std::string_view不太可能获得与std::string一样多的方法,只是因为它很方便或使两种类型更可互换。

但更重要的是,这些类型并不意味着可以互换。查看“清除”字符容器意味着什么?由于clear()存在于所有STL容器上并且做了有意义的事情,因此拥有std::string_view::clear()将会造成很大的混乱。

此外,某些数据视图仅供临时使用,例如只读函数参数。您为什么仍要分配给它?这是使用std::string_view的示例函数签名:

// Called e.g. with "x86_64-Darwin-16.7.0"
std::string_view extractOSName(std::string_view configStr)
{
    // Parse input, return a new view. Lifetime/ownership managed by caller.
    // No need to re-assign anything, let alone "clearing" them.
}

答案 1 :(得分:2)

这只是真正的猜测,但普遍的共识似乎是这些操作尚不清楚。

我个人认为“清除视图”是很有意义的(并且我们也不要忘记remove_prefixremove_suffix的存在!尽管见下文...),但我也同意还有其他可能很常见的解释,但意义不大。回想一下string_view是为了补充const std::string&,而不是std::string,并且您命名的函数都不是std::string常量接口的一部分。

说实话,我们根本需要进行此对话的事实本身可能就是一个很好的理由,因为它一开始就没有该功能。

the final proposal for string_view中,以下段落不是专门针对assignclear的,而是作为对他们思想的相关观点 [lol] 委员会:

  

s/remove_prefix/pop_front/, etc.

     

在Kona 2012中,我提出了一个range<>类,该类由pop_front等成员调整了范围的边界。在那里的讨论表明,委员会成员对轻量范围操作使用与容器操作相同的名称感到不舒服。现有做法并未对此操作的名称达成共识,因此我保留了Google StringPiece使用的名称。

实际上,该建议确实包含一个clear(),该记录毫不客气地从寄存器in a later, isolated, rationale-starved proposal中剔除。

现在,有人可能会争辩说,这些功能本来可以用不同的名称提供,但从未提出过,因此很难想象有什么替代名称可以解决这个问题,而不必只是操作的错误名称。

由于我们可以很容易地分配一个新的string_view,包括一个空的{{1}},因此整个问题都可以通过不费力地解决来解决。

答案 2 :(得分:1)

  

这些方法的实现对我来说似乎很简单,它们将使std::stringstd::string_view的使用更加可互换。

std::string_view不能替代std::string。它旨在替代const std::string&assignclear不是您可以调用的const std::string&的成员函数。