如何解决警告:支持对象的指针将在std :: pair的全表达式结束时被破坏
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;
}
我认为b
拥有对std::pair<std::string,int>
的引用,因此s
应该是对对对象中字符串的引用。为什么这会导致悬空指针错误?我在这里想念什么? Godbolt链接:https://godbolt.org/z/4zMvbr
解决方法
在std::string_view v = s.substr(i);
中,std::string::substr
按值返回std::string
,即返回临时std::string
。 std::string
可以隐式地由std::string_view
构造,即指向临时std::string::data()
的基础数组的指针,converted到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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。