назначение и инициализация ссылки из временного

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

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

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

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

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

   value.someProperty = 42;

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

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


person lurscher    schedule 28.03.2012    source источник


Ответы (1)


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

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

На самом деле это эквивалентно:

someValueType & value = map["key"];

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

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

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

Конечно, это было бы ошибкой, если бы ключ не существовал, поскольку вы бы разыменовывали конечный итератор.

person Kerrek SB    schedule 28.03.2012
comment
спасибо, Керрек, есть ли способ создать новый элемент на карте без временного? что-то вроде инициализации emplace? - person lurscher; 29.03.2012
comment
@lurscher: Да, но ни один из известных мне компиляторов пока не поддерживает это . (Все ассоциативные контейнеры имеют emplace в новом стандарте.) - person Kerrek SB; 29.03.2012
comment
@Irfy: я просто имел в виду, что на данный момент я не знаю ни одного компилятора + библиотеки, который реализует размещение ассоциативной карты. Он есть в стандарте, так что должен появиться, но практически пока не получил широкого распространения. - person Kerrek SB; 29.03.2012
comment
@Kerrek: я считаю, что VC ++ 11 Beta реализует размещение (хотя, очевидно, с запутанными вариативными шаблонами). - person ildjarn; 29.03.2012