让我们考虑一下这个简单的代码
#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实现中创建了一个临时对象。我是对的吗?