为什么此插入创建副本? 我看C++学习更多,我没有得到这个解释(上面提到的视频的确切时间戳)。< /P>

为什么此插入创建副本? 我看C++学习更多,我没有得到这个解释(上面提到的视频的确切时间戳)。< /P>,c++,C++,代码是 void Benchmark_Slow(int iters){ std::unordered_map<string, int> m; std::pair<const string, int> p = {}; while (iters--) m.insert(p); // ^ // Why does this create a copy? } void Benchmark\u Slow(i

代码是

void Benchmark_Slow(int iters){
    std::unordered_map<string, int> m;
    std::pair<const string, int> p = {};
    while (iters--) m.insert(p);
//                           ^
// Why does this create a copy?
}
void Benchmark\u Slow(int iters){
std::无序映射m;
std::pair p={};
而(iters--)m.insert(p);
//                           ^
//为什么要创建副本?
}
他说调用了
&
重载,而不是
常量&
重载,从而创建了一个副本。我试图理解这一点的问题是

  • 为什么要创建副本?是因为参数不是r值引用(有名称),因此不能“就地构造”吗
  • m.insert(std::move(p))
    是否修复了此问题

  • 你把它倒过来了。将调用
    常量&
    重载,而不是
    &
    。另外,在标题中,你问的是创建一个临时文件,但在问题正文中,你说的是创建一个副本。它是哪一个?请这样想:当前该对象属于您的函数,并且在函数返回时将被销毁。如果您希望将同一对象(而不是副本)存储在映射中(这意味着它必须在从映射中删除之前保持活动状态,而不是在函数返回之前),则必须将其所有权转移到映射,您可以使用
    std::move
    (这将调用
    &
    重载)。这是因为C++没有垃圾收集程序,否则将管理对象生存期。演讲者说它调用了
    &
    重载,但不确定你所说的
    &
    是什么意思。这将指示一个移动构造函数,在这种情况下不应该发生。无论如何,变量
    p
    Benchmark\u Slow
    堆栈中的堆栈变量,而映射指向的内容必须是heap。因此,如果这不会复制,那将是可疑的。另外,如果它不复制,地图会多次指向内存中的同一位置,对吗?那太糟糕了。如果您确实想避免调用副本,请使用移动操作,或者更好的
    std::unordered_map::emblace
    @Aziuth您看了视频吗?演讲者说它调用了'ref-ref'重载,我假设它是
    &&
    ,意思是移动构造函数。我要求澄清为什么它会像发言者所说的那样抄袭。