назначение и справочная инициализация из временного - PullRequest
2 голосов
/ 29 марта 2012

предположим, у меня есть следующее:

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

последняя строка содержит:

  • временный построенный экземпляр someValueType
  • присвоениевременно в новую запись карты
  • инициализация ссылки на запись карты

, поэтому, если следующая строка:

   value.someProperty = 42;

, это попытается изменитьзапись в карте верно?не оригинальное временное?

Я знаю в этом случае, если ссылка не может принимать временную, потому что она не является константной (поэтому ошибка компилятора или ее отсутствие может ответить на мой вопрос), но если я добавлюconst к ссылочной декларации, я не уверен, что правила оценки сказали бы в этом случае

1 Ответ

4 голосов
/ 29 марта 2012

Это правда.У вас есть инициализация с выражением присваивания справа:

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

Фактически это эквивалентно:

someValueType & value = map["key"];

Это потому, что оператор [] создает новыйэлемент, если он еще не существует для этого ключа.

Привязка записи карты к константной ссылке не имеет значения.Однако, если вы знаете, что ключ гарантированно существует, то вы можете связать константную ссылку с отображенным значением, даже если у вас есть только постоянная ссылка на саму карту:

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

Это будетошибка, конечно, если ключ не существует, так как вы разыменовываете конечный итератор.

...