C++ 为什么';t std::string\u视图有assign()和clear()方法吗?
这些方法的实现对我来说似乎很简单,它们将使C++ 为什么';t std::string\u视图有assign()和clear()方法吗?,c++,stl,string-view,C++,Stl,String View,这些方法的实现对我来说似乎很简单,它们将使std::string和std::string\u视图的使用更具互换性。毕竟,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
std::string
和std::string\u视图
的使用更具互换性。毕竟,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; // ""
std::字符串s{“abcd”};
std::string_view v{s.c_str()};
std::coutstd::string
接口因其自身的缺陷而名声不好,这就是为什么std::string_view
不太可能获得像std::string
那样多的方法,因为它很方便,或者使这两种类型更具互换性
但更重要的是,这些类型并不意味着可以互换。“清除”字符容器上的视图意味着什么?由于clear()
出现在所有STL容器上,并且做了一些有意义的事情,因此使用std::string\u view::clear()
将非常令人困惑
此外,某些数据的视图用于临时使用,例如只读函数参数。你为什么要分配给它呢?下面是一个使用std::string\u视图的函数签名示例:
// 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.
}
这些方法的实现对我来说似乎很简单,它们将使std::string
和std::string\u视图
的使用更具互换性
std::string\u视图
不打算取代std::string
。它旨在替代const std::string&
assign
和clear
不是您可以调用的const std::string&
的成员函数。这只是一种推测,但人们普遍认为这些操作可能不太清楚
我个人认为“清除视图”非常有意义(我们也不要忘记,remove_prefix
和remove_sufix
是存在的!尽管见下文……),但我也同意还有其他解释,可能是常见的,但意义不大。回想一下,string\u视图
旨在补充const std::string&
,而不是std::string
,并且您命名的函数都不是std::string
常量接口的一部分
老实说,事实上,我们需要这个对话本身,可能是一个很好的理由,只是没有功能放在首位
从中,以下段落不是关于assign
或clear
的,而是作为委员会对该主题的相关观点[lol]:
s/remove\u prefix/pop\u front/等
在Kona 2012年,我提出了一个范围
类,其中包含pop_front
等成员,这些成员调整了范围的界限。那里的讨论表明,委员会成员对使用与集装箱作业相同的轻型靶场作业名称感到不安。现有的做法不同意此操作的名称,因此我保留了Google的StringPiece
使用的名称
这项提案实际上包括一个clear()
,它被不客气地从登记册上删除了
现在,有人可能会争辩说,这些函数可以用不同的名称提供,但这从来没有被提出过,很难想象有什么替代名称可以解决这个问题,而不只是操作的坏名称
因为我们可以很容易地分配一个新的string\u视图
,包括一个空的视图,所以整个问题都可以通过简单地不费心解决。要清楚:您可能希望这些视图使对象“查看”另一个字符串(而不是实际修改当前查看的字符串)?是的,只是更改视图,不是底层字符串。这在语义上与相应的std::string
方法不同(这可能就是您要查找的原因)。就像更改指向nullptr的指针不同于删除指向的对象一样,string_视图的主要目的是替换函数参数中的const string&字符串。这是一个很好的问题,string_view::clear和string_view::assign的意义是什么。@Simpleton不,向量类比不成立。删除(并取消分配)所有元素。int
和int*
都是很容易解除分配的,没有语义上的区别。为了记录在案,我同意你的观点,即对assign
和clear
有一些“解释”,但没有明显的语义差异。但是您必须同意,clear
是否也会清除所查看的字符串本身可能会引起混淆,毕竟std::string
会这样做。我同意std::string
API完全被夸大了,但是assign()
和clear()
函数在所有容器中都是非常标准的。而std::string\u视图
充当一个容器,从这个意义上讲,无论您是在查看std::string\u视图
还是std::string常量&
,这都不重要。这就是我所说的可互换性。但是我不明白std::string\u view::clear()
有什么让人困惑。它还能做什么呢,除了清除视图,这样之后它就空了?没有人会期望它实际删除底层字符串,对吗?您说“如果您正在查看std::string\u视图
或std::string const&
,这不意味着assign
一开始就没有任何意义,因为不能修改std::string常量&
?关于clear
主题:我认为视图应该是短期对象,主要用于函数参数。重新设置o