【发布时间】:2016-09-12 13:56:54
【问题描述】:
最近,我对地图的下标运算符感到困惑。例如 ,代码如下所示
#include <map>
class A{
public:
int a;
A(){cout << "default constructor" <<endl;}
A(int a){
cout << "user_defined constructor" <<endl;
this->a = a;
}
A(const A& tmp){
cout << "copy constructor" <<endl;
this->a = tmp.a;
}
A& operator= (const A& tmp){
cout << "assign constructor" <<endl;
this->a = tmp.a;
return *this;
}
};
int main(){
std::map<int, A> m;
m[1] = A(1); // error occur right?
m.insert (make_pair(1,A(1))); // ok
}
我想知道我们编写代码时发生了什么。
m[1] = A(1); // it will first make a empty pair ? right?
m.insert (make_pair(1,A())); // here call default constructor
然后调用Assignment构造函数还是拷贝构造函数? 输出是
user_defined constructor
default constructor
copy constructor
copy constructor
assign constructor
能否详细解释一下,非常感谢。
【问题讨论】:
-
A不是默认可构造的,它不能是map的值 -
@KABoissonneault:可以。在这种情况下你不能使用
operator[]。 -
你需要什么样的“细节”?
-
@KABoissonneault 如果存在 A 的默认构造函数,我们可以写成 m[1] = A(1);
-
@BenjaminLindley 有趣。有点像如何在向量中使用仅移动类型,而不是
vector::push_back。我觉得那些“隐式动态 API 更改”没有很好的文档记录
标签: c++ dictionary stl operator-keyword