int main() { using kv = std::pair<const int,int>; std::vector<kv> vec; kv a{1,1}; vec.insert(vec.begin(),a); }
我试图将元素插入到该向量中,但编译器给出了这个错误:
cannot assign to non-static data member 'first' with const-qualified type 'const int'
而push_back()将正确编译.为什么?将元素插入到这样的向量中的正确方法是什么?
加:
我之所以使用std :: pair< const int,int>是我想实现类似std :: map的东西,并且不应修改键值对中的键.但我不确定std :: pair< const int,int>这是正确的做法.
解决方法
让我们从观察以下内容开始:
std::pair<const int,int> a,b; a=b;
这也不会编译.为什么?因为您实际声明了以下类:
class my_pair { public: // ... Bunch of irrelevant stuff const int first; int second; };
此类删除了其默认赋值运算符.默认赋值运算符等效于单独分配类成员:
pair<first,second> &operator=(const pair<first,second> &other) { first=other.first; second=other.second; return *this; }
这是默认赋值运算符的粗略示例.
但是你不能在这里修改第一个类成员,因为它是一个const类成员.因此,删除默认赋值运算符.最终结果:不能将具有const值的std :: pair分配给另一个这样的对.
您现在应该能够自己弄清楚为什么对矢量上的insert()不起作用.
insert()大致相当于在插入点之后的向量中将所有现有值移位1,以便为新值腾出空间.换一种说法:
value[n+1]=values[n];
对于超过插入点的所有值(我暂时忽略了将向量增加一个值所做的工作,这与此讨论无关).
但正如我所解释的那样,默认赋值运算符将被删除,因为该值具有const类成员.
push_back有效,因为不需要插入任何东西,只需要在向量的末尾添加一个新值.如果需要重新分配向量,以适应其增长,那么使用复制或移动构造函数,这对于具有const值的std ::对仍然有效.