string
有一个转化运算符string_view
;它构造了一个指向string_view
缓冲区的string
。如果在临时string
对象上调用此对象,string_view
对象将由于悬空指针很快而变为无效。
为什么string
不允许这种转换?它可以通过两个转换运算符来实现:
operator string_view() const & { /* ... */ }
operator string_view() && = delete;
答案 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_view
在SetBar()
期间有效。
string_view
作为参数类型是其最重要的用例之一。它的易用性与SetBar()
可以传递任何string
或char*
的事实直接相关。禁止将临时string
转换为string_view
会大大降低其实用性。