为什么string_view不允许从字符串临时进行构造?
Why doesn't string_view disallow construction from string temporaries?
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()
可以通过任何string
或char*
。 不允许将临时string
转换为string_view
会大大降低其实用性。
相关文章:
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 将向量解析<string>为字符串
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 两个数组,int 和 string,如何显示带有对应 int 的字符串?
- 将图形表示为unordered_map<字符串、向量>时拓扑排序错误<string>
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- 为什么 string::begin() 在即时窗口中输出整个字符串
- 比较 std::string 和 C 样式字符串文字
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 将 c 字符串直接写入 std::string
- std::hash<std::string> 可以为不同的字符串返回相同的值吗?
- 反转没有循环的字符串,C++中只有 std::string 成员
- 为什么我不必从 std::string 的函数中释放字符串c_str?
- 包括<字符串>,使用不完整的类型"std::string"
- 如何找到串联ASCII和std::string的子字符串
- 如何在c++中打印原始std::string/c样式的字符串
- 从映射<字符串、矢量中对唯一值进行排序<string>>
- C++ 在列表变量名称中查找字符串字符串<string>