假设你有这段代码
#include <iostream>
using namespace std;
std::string_view foo(){
char arr[3];
arr[0]='0';
arr[1]='1';
arr[2]='\0';
std::string_view sv = arr;
return sv;
}
int main(){
cout<<foo()<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
由于arr
是 在堆栈中,因此在创建期间sv
sv 应该指向堆栈中的某个位置,因此,由于 string_view 不会复制内部 char 数组的内容(与 std::string 上发生的情况相反),我会预计这里会出现错误,但它打印正确01
。
至少返回一个*是没有意义的。您可以这样做,但 astd::string_view
依赖于它提供视图的底层字符串表示形式。如果该超出范围,则对视图的任何成员访问都会导致尝试访问底层数据(因此几乎所有 \xe2\x80\x93 的大小可能都是单独存储的,但也可以从两个迭代器计算得出)会调用未定义的行为,从而导致您的程序无效。
不过,未定义的行为可能意味着任何\xe2\x80\x93 有时你会逃脱,观察预期的行为,有时你最终会崩溃,有时你会因为错误生效而陷入繁重的调试和定位错误很久以后,在一个看似完全不相关的地方......
\n*为后期读者进行后期编辑:当然,在给定的情况下,字符串视图将引用具有本地存储持续时间的数据;还有其他场景,返回一个是完全有效的,必要的前提是引用的数据至少有一个生命周期,只要字符串视图仍然用于访问它\xe2\x80\xa6
\n