C++ 字符串\u视图到常量引用字符串无效
我今天遇到了这个简单的代码C++ 字符串\u视图到常量引用字符串无效,c++,C++,我今天遇到了这个简单的代码 #include <iostream> #include <string> #include <string_view> #include <unordered_map> #include <vector> int main(int argc, char* argv[]) { std::unordered_map<std::string, int> m = { {"as
#include <iostream>
#include <string>
#include <string_view>
#include <unordered_map>
#include <vector>
int main(int argc, char* argv[]) {
std::unordered_map<std::string, int> m = {
{"asdf", 123},
{"dsdfesjfdaslkfjasljlasfjlasjfakdlsfjasklfajsklfjaskljlf", 123},
{"ldfjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldafjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldjaksdfjfjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldfjaslk}sfdasfdsfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldfjaslk}sfjalsksfdasdfdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
{"ldfjaslk}sfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj", 1},
};
std::vector<std::pair<std::string_view, int>> vec;
for (auto& [s, i] : m) {
vec.push_back(std::make_pair(s, i));
std::cout << vec.back().first << std::endl;
}
}
我猜向量中的string_视图不再指向正确的元素。但为什么会发生这种情况?我假设无序的_映射在迭代时是不可变的,这样键元素的地址就不会改变
Godbolt链接:使用
make\u pair
生成类型为std::pair
的临时对象。我希望转换到std::pair
会抛出一个错误,但显然它是有效的
无论如何,std::string_view
是非所有权的,所以一旦临时对象被销毁(在;
行的末尾),它就变得悬空
你不应该做一双新的。尝试将键和值放置回。不会
std::make\u pair
复制字符串,然后vec存储对副本的引用?啊哈。因此,当我将其固定为vec.push_back(std::make_pair(std::string_视图,I))代码>,它修复了它。但我想知道这怎么会不是一种默认行为呢?使用emplace\u back
和不使用make\u pair
:;-)时效果更好酷。有人告诉我,不要让你回来,因为这可能会叫你意想不到的医生。但我想这是我发现它有用的唯一一种情况:p存在转换,因为std::string
到std::string\u视图
是一种隐式转换。你有点明白为什么人们对这个决定感到“不安”。@路人说真的吗?我想我现在要加入“沮丧俱乐部”。
�/�U.�Usfdasdfdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
�/�U.�Usfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
@/�U.�Ukdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
�/�U.�Usfjalskdfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
@/�U.�Udfjlkdasjfaslkfjaskdljflaskdfjdaslkfjasdlkfjasdlj
.�Usljlasfjlasjfakdlsfjasklfajsklfjaskljlf
asdf