对我来说,这些方法的实现似乎很简单,它们将使std::string
和std::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
的目的,对吧?
答案 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_prefix
和remove_suffix
的存在!尽管见下文...),但我也同意还有其他可能很常见的解释,但意义不大。回想一下string_view
是为了补充const std::string&
,而不是std::string
,并且您命名的函数都不是std::string
常量接口的一部分。
说实话,我们根本需要进行此对话的事实本身可能就是一个很好的理由,因为它一开始就没有该功能。
在the final proposal for string_view
中,以下段落不是专门针对assign
或clear
的,而是作为对他们思想的相关观点 [lol] 委员会:
s/remove_prefix/pop_front/, etc.
在Kona 2012中,我提出了一个
range<>
类,该类由pop_front
等成员调整了范围的边界。在那里的讨论表明,委员会成员对轻量范围操作使用与容器操作相同的名称感到不舒服。现有做法并未对此操作的名称达成共识,因此我保留了GoogleStringPiece
使用的名称。
实际上,该建议确实包含一个clear()
,该记录毫不客气地从寄存器in a later, isolated, rationale-starved proposal中剔除。
现在,有人可能会争辩说,这些功能本来可以用不同的名称提供,但从未提出过,因此很难想象有什么替代名称可以解决这个问题,而不必只是操作的错误名称。
由于我们可以很容易地分配一个新的string_view
,包括一个空的{{1}},因此整个问题都可以通过不费力地解决来解决。
答案 2 :(得分:1)
这些方法的实现对我来说似乎很简单,它们将使
std::string
和std::string_view
的使用更加可互换。
std::string_view
不能替代std::string
。它旨在替代const std::string&
。 assign
和clear
不是您可以调用的const std::string&
的成员函数。