为什么const不适用于stl map的size(),而它适用于其他容器?

Nam*_*nha 1 c++ stl const vector

在处理一个难以在整体上解释/解释的问题时遇到,所以这里是问题的相关重构.

在windows上用gnu g ++编译这段代码

int recreate(const map <int , vector<string> > &bitFieldMap){
    cout<<bitFieldMap[1].size();
}
int main(){}
Run Code Online (Sandbox Code Playgroud)

给出以下神秘错误

在函数'int recreate(const std :: map >> &&)'中:D:\ playground\testit.cpp:12:21:错误:将'const std :: map >>>传递为'std'的'st'参数:: map <_Key,_Tp,_Compare,_ Alloc> :: mapped_type&std :: map <_Key,_Tp,_Compare,_Alloc> :: operator [](std :: map <_Key,_Tp,_Compare,_Alloc> :: key_type && )[with _Key = int; _Tp = std :: vector>; _Compare = std :: less; _Alloc = std :: allocator >>>; std :: map <_Key,_Tp,_Compare,_Alloc> :: mapped_type = std :: vector>; std :: map <_Key,_Tp,_Compare,_Alloc> :: key_type = int]'丢弃限定符[-fpermissive] cout <

而从重新创建函数中删除const后,它运行良好,即

int recreate( map <int , vector< string > > &bitFieldMap){
    cout<< bitFieldMap[1].size() ;
}
int main(){}
Run Code Online (Sandbox Code Playgroud)

在我的理解中,当值保持不变时,我们使用const来指示编译器进行一些优化.现在,对象上使用的size()函数在每次执行时都会改变某些值,或者某些内存被分配给调用size()时映射容器.

现在我的问题可以通过不在这里使用const或使用multimap来解决.但为什么const和size显示出这种行为?

BoB*_*ish 6

你没有打电话size()map.您正在调用operator[]map,这是一种非const手术,因为它会在该位置创建一个元素,如果一个已经不存在.

然后,您尝试调用size()vector<string>那个位置,但它是由这一点为时已晚.顺便提一下,size() const标准库容器.