对于通常用于访问数据结构的操作员来说,在我看来"邪恶"(在C++常见问题中的含义),突然被定义为将数据插入数据结构.
我想问题是'什么会更好'?对于某些类型的映射值,可以轻松回答这个问题; 例如,如果我们将键映射到指针,您可能真的希望operator []为不存在的键返回nullptr,但这显然不适用于其他类型.
它可以在不存在的键上抛出异常,甚至默认构造一个临时的并返回它而不将其添加到地图中.将[]从读取语义转换为此容器类型的写入语义的好理由是什么?
Sin*_*ion 12
基本问题是没有可靠区分的句法方法:
dosomething(collection[foo]);
Run Code Online (Sandbox Code Playgroud)
从
collection[foo] = something;
Run Code Online (Sandbox Code Playgroud)
在运营商的定义中.因为它可能出现在任一位置,所以该类确保它可以处理两者,如果需要,提供默认覆盖.如果你发现这是不合情理的,那么你需要std::map::operator[]完全避免.
另一个原因是当密钥不在列表中时必须有一些已定义的行为.由于operator[]必须返回一个值(LValue或RValue),因此它不能返回空指针,past-the-end迭代器或任何其他sentinel值.唯一剩下的选择是提出例外.STL不会引发很多异常,因为即使在没有异常的情况下也可以使用它.必须选择其他一些行为,这就是结果.
解决此问题的最佳方法是使用std::map不具有此行为的成员函数.那将是map::find(),map::end如果找不到密钥则返回.