gpt4 book ai didi

c++ - 为什么 std::map::operator[] 如此违反直觉?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:20 28 4
gpt4 key购买 nike

在我看来,通常用于访问数据结构的运算符突然被定义为将数据插入数据结构,这在我看来是“邪恶的”(在 C++ FAQ 中这个词的含义)。

我想问题是“什么会更好”?对于某些类型的映射值,这个问题很容易回答;例如,如果我们将键映射到指针,您可能真的希望 operator[] 为不存在的键返回 nullptr,但这显然不适用于其他类型。

它可以在不存在的键上抛出异常,或者甚至默认构造一个临时的并返回它而不将它添加到映射中。对于这种容器类型,将 [] 从读取语义转换为写入语义的充分理由是什么?

最佳答案

基本问题是没有可靠区分的句法方式:

dosomething(collection[foo]);

来自

collection[foo] = something;

在运营商的定义中。因为它可能出现在任一位置,所以该类确保它可以处理这两个位置,并在必要时提供默认覆盖。如果您发现这是不合情理的,那么您需要完全避免使用 std::map::operator[]

另一个原因是当键不在列表中时必须有一些定义的行为。由于 operator[] 必须返回一个值(LValue 或 RValue),因此它不能返回空指针、尾后迭代器或任何其他标记值。唯一剩下的选择是提出异常(exception)。 STL 不会引发很多异常,因为即使在没有异常的情况下也可以使用它。必须选择其他一些行为,这就是结果。

解决此问题的最佳方法是使用不具有此行为的 std::map 的成员函数。那将是 map::find(),如果找不到 key ,它会返回 map::end

关于c++ - 为什么 std::map::operator[] 如此违反直觉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382656/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com