临时分配和引用初始化

时间:2012-03-28 21:00:33

标签: c++ reference initialization temporary-objects

假设我有以下内容:

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

最后一行包含:

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

所以如果下一行是:

   value.someProperty = 42;

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

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

1 个答案:

答案 0 :(得分:4)

这是真的。您在右侧有一个带有赋值表达式的初始化:

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

实际上,这相当于:

someValueType & value = map["key"];

这是因为[] - 运算符会创建一个新元素(如果该元素尚不存在)。

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

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

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