假设我有以下内容:
boost::unordered_map< string , someValueType > map;
someValueType& value = map[ "key" ] = someValueType();
最后一行包含:
someValueType
所以如果下一行是:
value.someProperty = 42;
这会尝试更改地图条目吗?不是原来的临时?
我知道在这种情况下,如果引用不能暂时,因为它是非const(所以编译器错误或没有一个会回答我的问题),但如果我将const添加到引用声明,我我不确定评估规则在这种情况下会说什么
答案 0 :(得分:4)
这是真的。您在右侧有一个带有赋值表达式的初始化:
someValueType & value = (map["key"] = someValueType());
实际上,这相当于:
someValueType & value = map["key"];
这是因为[]
- 运算符会创建一个新元素(如果该元素尚不存在)。
将地图条目绑定到const引用没有任何区别。但是,如果您知道密钥保证存在,那么即使您只有对映射本身的常量引用,也可以将const引用绑定到映射值:
void (MapType const & m)
{
someValueType const & = m.find("key")->second;
}
如果密钥不存在,那么这将是一个错误,因为您将取消引用结束迭代器。