首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么std::map没有常量访问器?

为什么std::map没有常量访问器?
EN

Stack Overflow用户
提问于 2012-12-16 23:25:52
回答 4查看 6.4K关注 0票数 69

std::map上的[]运算符的声明如下:

代码语言:javascript
复制
T& operator[] ( const key_type& x );

有什么原因不是这样的吗?

代码语言:javascript
复制
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );

因为当您需要访问const方法中的成员映射时,这将是非常有用的。

EN

回答 4

Stack Overflow用户

发布于 2012-12-16 23:35:43

从C++11开始,有了std::map::at,它提供常量和非常量访问。

operator[]相比,如果元素不在映射中,它将抛出std::out_of_range异常。

票数 85
EN

Stack Overflow用户

发布于 2012-12-16 23:36:50

这些答案是正确的,因为operator[]具有在键不存在时添加键的语义,但我想添加另一个观点:

注意operator[]是如何返回一个T&的。也就是说,它返回对与key关联的value的引用。但是如果map中没有key呢?我们应该返回什么?没有“空引用”这回事,抛出异常会很烦人。

这将是不使用operator[] const的一个很好的理由。如果您不能向map添加任何内容(因为运算符是const),但是用户正在查找一个不存在的项,那么您将向用户返回什么?这个问题的一个很好的解决方案是不使用operator[] const

票数 16
EN

Stack Overflow用户

发布于 2012-12-16 23:28:14

如果密钥不存在,(非const) operator[]将创建该密钥。

该操作符const版本(如果存在)必须具有不同的语义,因为它不能添加新键。

我相信你会同意,让const和非const重载具有明显不同的语义将是一堆蠕虫。因此,没有提供const版本。

不过,有一个const find()成员,所以您可以在代码中使用它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13902742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档