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

问题描述 投票:0回答:1

假设你有这个代码

#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;
}

由于

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

c++ c++17
1个回答
5
投票

至少退货没有意义*。您可以这样做,但是

std::string_view
依赖于它提供视图的底层字符串表示形式。如果那个超出了范围,则对视图的任何成员访问都会导致尝试访问底层数据(因此几乎所有 - maybe 大小都是单独存储的,但也可以通过两个迭代器计算)调用 undefined行为并因此使您的程序无效。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.