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::string。std::string可以隐式转换为std::string_view,它是从 构造的std::string::data(),即指向临时 的底层数组的指针std::string。完整表达式后,临时指针std::string被销毁,并且所持有的指针std::string_view成为悬空指针。
程序员有责任确保生成的字符串视图不会比字符串寿命更长。
Run Code Online (Sandbox Code Playgroud)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