std :: map:为什么复制构造函数被调用两次?

时间:2017-10-13 18:56:03

标签: c++ makefile copy-constructor stdmap std-pair

让我们考虑一下这个简单的代码

#include <iostream>
#include <map>

class my_class {
    std::string name;
    int age;
    public:
    my_class():name(""), age(0) {
        std::cout << "Default constructor" << std::endl;
    }
    my_class(std::string nm, int a) : name(nm), age(a) {
        std::cout << "Constructor with both parameters" << std::endl;
    }
    my_class(const my_class& obj) {
        std::cout << "copy_constructor " << std::endl;
        name = obj.name;
        age = obj.age;
    }
    void show() {
        std::cout << "name=: " << name << "age=: " << age <<std::endl;
    }
};

int main() {
    std::map<int, my_class> m;
    m[0];
    return 0;
}

我通过这个gcc编译它(我的gcc版本:gcc版本5.4.0 20160609):

g++ -o main main.cpp

运行后,我们看到复制构造函数已被调用两次:

Default constructor
copy_constructor 
copy_constructor 

复制构造函数的第一次调用是因为operator []。对此函数的调用等同于:

(*((this->insert(make_pair(k,mapped_type()))).first)).second

因此,我们看到make_pair调用了my_class的复制构造函数。 但是第二次调用复制构造函数的原因对我来说并不清楚。我只是假设它在make_pair实现中创建了一个临时对象。我是对的吗?

0 个答案:

没有答案