我很确定我已经在某个地方看到了这个问题(comp.lang.c ++?Google似乎也没有在那里找到它)但是这里的快速搜索似乎没有找到它所以这里是:
如果密钥不存在,为什么std :: map operator []会创建一个对象?我不知道,但对我而言,如果你与大多数其他运算符[](如std :: vector)进行比较,这似乎是违反直觉的,如果你使用它,你必须确保索引存在.我想知道在std :: map中实现这种行为的理由是什么.就像我说的那样,当使用无效密钥访问时,更像行动中的索引和崩溃(我猜是未定义的行为)会不会更直观?
看到答案后提炼我的问题:
好到目前为止,我得到了很多答案,说基本上它便宜,所以为什么不是或类似的东西.我完全同意这一点,但为什么不使用专用函数(我认为其中一条评论说在java中没有operator []并且函数被称为put)?我的观点是为什么不映射operator []像vector一样工作?如果我在向量上的超出范围索引上使用operator []我不希望它插入一个元素,即使它很便宜,因为这可能意味着我的代码中的错误.我的观点是为什么地图不一样.我的意思是,对我来说,在地图上使用operator []意味着:我知道这个密钥已经存在(无论出于什么原因,我只是插入它,我在某处有冗余,无论如何).我认为这样会更直观.
那说使用operator []执行当前行为的优点是什么(仅限于此,我同意具有当前行为的函数应该在那里,而不是operator [])?也许它以这种方式提供更清晰的代码?我不知道.
另一个答案是,它已经存在,所以为什么不保留它然后,可能当他们(stl之前的那些)选择实现它,他们发现它提供了一个优势或什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他运算符[]有点缺乏一致性.它给了什么好处?
谢谢
我想知道是否有办法在msvc(2005)中获得有关错误位置的更好信息?
例如,当我从类中继承boost :: noncopyable时,我得到一个C2248错误,例如:
错误C2248:'boost :: noncopyable _ :: noncopyable :: noncopyable':无法访问类'boost :: noncopyable _ :: noncopyable'中声明的私有成员.此诊断发生在编译器生成的函数'MyClass :: MyClass(const MyClass&)'中
但它没有告诉我复制构造函数的确切位置.这有点烦人.我真的不确定,但我想我记得看到某个设置我可以指定输出级别或其他东西,但我搜索并发现什么,所以我的问题是:有没有办法在msvc中变得更好(更丰满?)错误消息?
编辑:好吧,因为stackoverflow只是告诉我,我应该接受一个答案,我想知道是否有人可以告诉msvc 2008/2010是否给这个错误更好的诊断?有人还提到GCC应该这样做,有人能证实这一点吗?那么其他编译器呢(Intel?,Comeau?)
谢谢