当你写:
auto blah = map[key];
operator[] 用 a 调用key
,它返回一个值。
当你写:
map[key] = blah;
然后 operator[key] 用 a 调用key
,它返回一个值,然后 operator= 用blah
参数调用该值。
这意味着可能很难检测到您实际在哪里读取或写入地图。
但是,通常,在 READ 案例中,案例可能会退回到被value const& operator[] const
调用,而在写入期间,它会value& operator[]
没有 const标记。因此,您可能会尝试通过 const 说明符重载运算符:提供 2 个 operator[],一个 const,一个非常量,并且仅在后者中增加大小。
这很简单,但并不总是能正常工作,因为您有时可能会意外调用“operator[] as read”,但没有编译器可确定的 const 约束。我目前无法确切说明何时、如何以及是否有可能,但我想如果你对 constness 不太小心的话,你可以很容易地做到这一点。
如果你做到了,那么我知道的唯一选择是在非常量模式下为返回值提供一个包装器,并在 const 模式下保持正常:
myMap::valueType const & operator[](key...) const
mymap::wrapper<myMap::valueType>& operator[](key...)
您的包装器会记住您的 Map 的 ref& 并会记住 KEY,并且该包装器将提供隐式转换到 valueType,并且它将提供赋值运算符 FROM-valueType-TO-wrappertype。隐式转换为值类型将执行从映射到给定键的读取,并且不会增加计数器,而运算符=(从值类型,到包装类型)将执行对映射的写入。
这肯定会奏效,但这种方法可能已经过时了。我不熟悉 c'11 的更改,所以现在可能有一些更好的选项可用 - 例如,移动&&
语义可能会在这里改变一些东西,即可能是重载
valueType&& operator[](key)
也有可能----但我不知道。我只知道 return-a-transparent-wrapper 方法。
编辑:这是一个很好的(似乎完整的)示例,它支持读取和写入并区分这两者:
堆栈:如何使用下标运算符中分配的值做一些事情?