函数体中创建的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 大小都单独存储,但可以计算也来自两个迭代器)调用未定义的行为并因此使您的程序无效。

不过,未定义的行为可能意味着任何事情 – 有时你会逃避,观察预期的行为,有时你会崩溃,有时你会陷入繁重的调试并定位错误,因为错误在一个看似完全不相关的地方很晚才生效...