为什么string_view不允许从字符串临时进行构造?

Why doesn't string_view disallow construction from string temporaries?

本文关键字:字符串 string view 不允许 为什么      更新时间:2023-10-16

string有一个转换运算符来string_view;它构造了一个指向string缓冲区的string_view。 如果在临时string对象上调用此函数,则string_view对象将很快由于悬空指针而失效。

为什么string不允许这种转换? 它可以使用两个转换运算符来做到这一点:

operator string_view() const & { /* ... */ }
operator string_view() && = delete;

从临时创建string_view通常是安全的,并且非常有用,不允许。

回想一下,只要计算包含临时对象的完整表达式,临时对象的生存期就会延长。 当string_view用作函数参数时,这一点尤其重要。 考虑这两个函数的情况:

std::string GetFoo() { /* ... */ }
void SetBar(std::string_view value) {
  // code that uses value's contents, possibly copying it into a new
  // buffer, but which does not save the string_view for later access
}

鉴于这些函数,调用是完全安全的

SetBar(GetFoo());

因为表示临时字符串的string_view将在 SetBar() 的持续时间内有效。

string_view作为参数类型是其最重要的用例之一。 它的易用性与以下事实直接相关:SetBar()可以通过任何stringchar*。 不允许将临时string转换为string_view会大大降低其实用性。