【发布时间】:2019-01-24 11:53:36
【问题描述】:
这些方法的实现对我来说似乎很简单,它们将使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; // ""
那么,标准中没有包括这两种明显的方法的原因是什么?
更新:
您的 cmets 中的一个普遍问题似乎是“有什么意义?”,所以我会给您一些背景信息。我正在解析一个大字符串,结果是子字符串的结构。该结果结构是字符串视图的自然候选者,因此我不必复制所有那些甚至重叠的字符串。结果的一部分是到字符串视图的映射,因此我可能需要在获取键时将它们构造为空,并在稍后获取值时填充它们。在解析时,我需要跟踪中间字符串,这涉及更新和重置它们。现在它们也可以被字符串视图替换,这就是我在那些缺失的函数上发生的事情。当然,我可以继续使用字符串或用普通的旧 ptr-ptr 或 ptr-size 对替换它们,但这正是 std::string_view 的用途,对吧?
【问题讨论】:
-
要明确:您会期望这些使对象“查看”不同的字符串(实际上并未修改当前查看的字符串)?
-
是的,只是改变视图,而不是底层字符串。
-
这在语义上与相应的
std::string方法不同(这可能是您正在寻找的原因)。就像更改指向 nullptr 的指针与删除指向的对象不同。 -
Afaik,string_view 的主要目的是替换函数参数中的 const string&。这是一个很好的问题,string_view::clear 和 string_view::assign 的意义是什么。
-
@Simpleton 不,那个向量类比不成立。您删除(并取消分配)所有元素。
int和int*都是微不足道的释放,没有语义差异。作为记录,我同意你的观点,assign和clear的“解释”没有明显的语义差异。但是您必须同意,clear是否也清除查看的字符串本身可能会造成混淆 - 毕竟std::string会这样做。
标签: c++ stl string-view