suppose i have the following:

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

the last line contains:

  • a temporary constructed instance of someValueType
  • an assignment of the temporary into a new map entry
  • initialization of a reference to the map entry

so if next line is:

   value.someProperty = 42;

this will try to change the map entry right? not the original temporary?

I know in this case if the reference couldn't take a temporary because it is non const (so a compiler error or the absence of one would answer my question), but if i added the const to the reference declaration, i'm not sure what the evaluation rules would say in this case

有帮助吗?

解决方案

That's true. You have an initialization with an assignment expression on the right:

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

In fact, this is equivalent to:

someValueType & value = map["key"];

This is because the []-operator creates a new element if one doesn't already exist for that key.

Binding the map entry to a const reference makes no difference. However, if you know that the key is guaranteed to exist, then you can bind a const reference to the mapped value even if you only have a constant reference to the map itself:

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

This would be an error of course if the key didn't exist, since you'd be dereferencing the end iterator.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top