2

假设我有以下内容:

boost::unordered_map< string , someValueType > map;
someValueType& value = map[ "key" ] = someValueType();

最后一行包含:

  • 一个临时构造的实例someValueType
  • 将临时分配到新的地图条目中
  • 初始化对映射条目的引用

所以如果下一行是:

   value.someProperty = 42;

这将尝试更改地图条目对吗?不是原来临时的?

我知道在这种情况下,如果引用不能取临时值,因为它是非 const (所以编译器错误或没有一个会回答我的问题),但如果我将 const 添加到引用声明中,我不是确定在这种情况下评估规则会说什么

4

1 回答 1

4

确实如此。您在右侧有一个赋值表达式的初始化:

someValueType & value = (map["key"] = someValueType());

事实上,这相当于:

someValueType & value = map["key"];

这是因为[]如果该键不存在一个新元素,则 -operator 会创建一个新元素。

将映射条目绑定到 const 引用没有任何区别。但是,如果您知道该键保证存在,那么即使您只有对映射本身的常量引用,您也可以将 const 引用绑定到映射值:

void (MapType const & m)
{
    someValueType const & = m.find("key")->second;
}

如果密钥不存在,这当然是一个错误,因为您将取消引用结束迭代器。

于 2012-03-28T21:02:51.423 回答