函数体中创建的std::string_view可以返回吗?

Alb*_*chi 1 c++ c++17

假设你有这段代码

#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是 在堆栈中,因此在创建期间svsv 应该指向堆栈中的某个位置,因此,由于 string_view 不会复制内部 char 数组的内容(与 std::string 上发生的情况相反),我会预计这里会出现错误,但它打印正确01

Aco*_*gua 5

至少返回一个*是没有意义的。您可以这样做,但 astd::string_view依赖于它提供视图的底层字符串表示形式。如果该超出范围,则对视图的任何成员访问都会导致尝试访问底层数据(因此几乎所有 \xe2\x80\x93 的大小可能都是单独存储的,但也可以从两个迭代器计算得出)会调用未定义的行为,从而导致您的程序无效。

\n

不过,未定义的行为可能意味着任何\xe2\x80\x93 有时你会逃脱,观察预期的行为,有时你最终会崩溃,有时你会因为错误生效而陷入繁重的调试和定位错误很久以后,在一个看似完全不相关的地方......

\n
\n

*为后期读者进行后期编辑:当然,在给定的情况下,字符串视图将引用具有本地存储持续时间的数据;还有其他场景,返回一个是完全有效的,必要的前提是引用的数据至少有一个生命周期,只要字符串视图仍然用于访问它\xe2\x80\xa6

\n