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