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