std::map 是否从其 const 引用创建对象的新非 const 副本

Is std::map creating a new non const copy of object from its const reference

考虑以下代码。

#include <iostream>
#include <map>

class A{

public:
    int m_id;
    int m_x;
    int m_y;
    A() = default;
    A(int i, int j, int k) : m_id(i), m_x(j), m_y(k){}
};

void add(const A& a, std::map<int,A>& m){
    m[a.m_id] = a; 
}

void modify(std::map<int,A>& m){
    for(auto& x : m){
        x.second.m_x*=10;
        x.second.m_y/=10;
    }
}
void print(std::map<int,A>& m){
    for(const auto& x : m){
        std::cout << x.first << " : (" << x.second.m_x << ',' << x.second.m_y << ")\n";
    }
    std::cout << '\n';
}
int main(int argc, char const *argv[])
{   
    std::map<int,A> m;
    A a(1,10,100);
    add(a,m);
    print(m);
    {
        A b(2,10,200);
        add(b,m);
        print(m);
    }    

    modify(m);
    print(m);
    return 0;
}

我正在创建 std::mapA 类型的对象。在 add 中,我通过使用对该对象的 const 引用将对象添加到 std::map。在 modify 中,我正在修改 std::map 的值。 print,我正在打印地图。基本上访问元素。
我在不同的范围内添加 b 以测试它是否出现内存错误。
该代码工作正常。 我的问题是,std::map[] 运算符是否创建了一个新的非 const 对象副本?此外,std::vector::push_back 工作正常。 push_back 是否也创建一个副本。我不打电话给 emplace.

是的,将构造一个新对象作为std::map的元素。确切地说,在m[a.m_id] = a;中,如果key(即a.m_id)不存在,则首先构造一个值初始化的A作为m的新元素, 然后 m[a.m_id] returns 对新元素值的引用;稍后通过 A 的复制赋值运算符从 a 复制赋值。

如果键(即a.m_id)已经存在,m[a.m_id]只是returns对已存在元素值的引用;这是从 a then.

复制分配的