住在科利魯
string_view 系列模板特化提供了一種有效的方法,可以將只讀的、例外安全的、非擁有句柄傳遞給序列的第一個元素在位置零的任何類似字串的物件的字符資料。
#include <iostream>
#include <string_view>
#include <unordered_map>
using namespace std;
std::unordered_map<std::string_view, int> create_map()
{
std::unordered_map<std::string_view, int> umap;
std::string s1("s1");
auto s2_bad = new std::string("s2");
umap.emplace(std::make_pair(s1, 1)); // doesn't work b/c sv points to local variable
umap.emplace(std::make_pair(*s2_bad, 2)); // Q1> why doesn't this work?
umap.emplace(std::make_pair("s3", 3)); // Q2> why does this work?
auto s4_bad = new std::string("s4_bad");
umap.emplace(std::make_pair(s4_bad->c_str(), 4)); // this works
return umap;
}
int main()
{
auto abc_map = create_map();
for(const auto&[key, value]: abc_map)
{
std::cout << "key: " << key << std::endl;
std::cout << "value: " << value << std::endl;
}
return 0;
}
輸出:
key: s3
value: 3
key: $
value: 2
key: s4_bad
value: 4
key: $
value: 1
問題 1 > 為什么s2_bad在這里不起作用?即使它指向分配的地址空間。
問題 2 > 為什么插入字串文字“s3”在這里起作用?即使它是在函式范圍內定義的?
uj5u.com熱心網友回復:
問題1:std::make_pair(*s2_bad, 2)將創建一個std::pair<std::string, int>,因此該對具有一個不同的臨時std::string,與指向的字串無關s2_bad。然后,std::string_view將從此臨時構建一個,該臨時將被立即銷毀。所以那一刻umap.emplace(std::make_pair(*s2_bad, 2));結束,string_view是無效的。如果您想避免此副本(以及相關的生命周期問題),您可以std::ref(*s2_bad)使用*s2_bad.
問題 2:字串文字有static生命周期,即它們的內容存盤在二進制檔案的只讀部分而不是堆疊中,因此持有指向字串文字的指標并從包含字串文字的函式回傳不會造成任何懸空指標問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457292.html
標籤:C
上一篇:嵌套while回圈中的錯誤輸入
