警告:支持指针的对象将在 std::pair 的完整表达式末尾被销毁

Jae*_*bum 13 c++ temporary stdstring string-view c++17

以下代码给出了悬空指针错误。

    std::vector<std::pair<std::string, int>> c;
    for (auto& b : c) {
        const auto& [s, i] = b;
        std::string_view v = s.substr(i);
        std::cout << v;
    }
Run Code Online (Sandbox Code Playgroud)

我认为它b保存了对 的引用std::pair<std::string, int>,所以s应该是对pair对象中字符串的引用。为什么这会产生悬空指针错误?我在这里缺少什么?godbolt 链接: https: //godbolt.org/z/4zMvbr

son*_*yao 11

在 中std::string_view v = s.substr(i);,按值std::string::substr返回std::string,即返回一个临时的std::stringstd::string可以隐式转换std::string_view,它是从 构造的std::string::data(),即指向临时 的底层​​数组的指针std::string。完整表达式后,临时指针std::string被销毁,并且所持有的指针std::string_view成为悬空指针。

程序员有责任确保生成的字符串视图不会比字符串寿命更长。

std::string get_string();
int f(std::string_view sv);
 
int x = f(get_string()); // OK
std::string_view sv = get_string(); // Bad: holds a dangling pointer
Run Code Online (Sandbox Code Playgroud)