函数体中创建的std::string_view可以返回吗?
Can std::string_view created in function body be returned?
假设你有这个代码
#include <iostream>
using namespace std;
std::string_view foo(){
char arr[3];
arr[0]='0';
arr[1]='1';
arr[2]='[=11=]';
std::string_view sv = arr;
return sv;
}
int main(){
cout<<foo()<<endl;
return 0;
}
由于arr
在栈中,在sv
的创建过程中,sv应该指向栈中的一个位置,因此,由于string_view不复制内容内部 char 数组(与 std::string 上发生的情况相反),我预计这里会出现错误,但它会正确打印 01
.
至少对return一个是没有意义的。您可以这样做,但是 std::string_view
依赖于它提供视图的底层字符串表示形式。如果那个已经超出范围,任何成员访问导致尝试访问底层数据的视图(所以几乎所有 - maybe 大小都单独存储,但可以计算也来自两个迭代器)调用未定义的行为并因此使您的程序无效。
不过,未定义的行为可能意味着任何事情 – 有时你会逃避,观察预期的行为,有时你会崩溃,有时你会陷入繁重的调试并定位错误,因为错误在一个看似完全不相关的地方很晚才生效...
假设你有这个代码
#include <iostream>
using namespace std;
std::string_view foo(){
char arr[3];
arr[0]='0';
arr[1]='1';
arr[2]='[=11=]';
std::string_view sv = arr;
return sv;
}
int main(){
cout<<foo()<<endl;
return 0;
}
由于arr
在栈中,在sv
的创建过程中,sv应该指向栈中的一个位置,因此,由于string_view不复制内容内部 char 数组(与 std::string 上发生的情况相反),我预计这里会出现错误,但它会正确打印 01
.
至少对return一个是没有意义的。您可以这样做,但是 std::string_view
依赖于它提供视图的底层字符串表示形式。如果那个已经超出范围,任何成员访问导致尝试访问底层数据的视图(所以几乎所有 - maybe 大小都单独存储,但可以计算也来自两个迭代器)调用未定义的行为并因此使您的程序无效。
不过,未定义的行为可能意味着任何事情 – 有时你会逃避,观察预期的行为,有时你会崩溃,有时你会陷入繁重的调试并定位错误,因为错误在一个看似完全不相关的地方很晚才生效...