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

时间:2017-10-13 19:01:09

标签: c++ c++17

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

为什么string不允许这种转换?它可以通过两个转换运算符来实现:

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

1 个答案:

答案 0 :(得分:0)

从临时创建string_view通常是安全的,并且禁止使用它是非常有用的。

回想一下,只要正在评估包含它的full-expression,临时对象的生命周期就会延长。当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_viewSetBar()期间有效。

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