Операторы индексов
const контейнеров STL
могут возвращать ссылку на const, поскольку они отклоняют вызовы к нему с индексами, которых нет в контейнере. Поведение в этом случае не определено. Следовательно, как мудрый выбор дизайна, std::map
даже не обеспечивает перегрузку оператора индекса const.
QMap пытается быть немного более приспособленным, предоставляет перегрузку оператора const в качестве синтаксического сахара, сталкивается с проблемой с несуществующими ключами, снова пытается быть более удобной и вместо этого возвращает значение, созданное по умолчанию.
Если вы хотите сохранить соглашение о возврате по константной ссылке в STL, вам нужно выделить статическое значение и вернуть ссылку на , что . Это, однако, противоречило бы гарантиям повторного входа, которые предоставляет QMap
, поэтому единственный вариант - возврат по значению. У const
есть только сахарное покрытие, чтобы предотвратить некоторые глупые ошибки, такие как constmap["foo"]++
от компиляции.
Тем не менее, возвращение по ссылке не всегда является наиболее эффективным способом. Если вы возвращаете фундаментальный тип или, при более агрессивной оптимизации, когда sizeof(T)<=sizeof(void*)
, возвращаемое значение часто заставляет компилятор возвращать результат в регистр напрямую, а не косвенно (адрес для результата в регистре) или - не дай бог - в стеке.
Другая причина (кроме преждевременной пессимизации) предпочитать передачу по константной ссылке, нарезку, здесь не применима, так как std::map
и QMap
основаны на значениях и, следовательно, однородны. Для гетерогенного контейнера вам нужно хранить указатели, а указатели являются фундаментальными типами (конечно, кроме умных).
Тем не менее, я почти никогда не использую оператор константного индекса в Qt. Да, он имеет более приятный синтаксис, чем find()
+ *it
, но неизменно вы получите count()
/ contains()
вызовов прямо перед оператором константного индекса, что означает, что вы выполняете бинарный поиск дважды . И тогда вы все равно не заметите крошечных различий в производительности возвращаемого значения:)
Для value() const
, однако, я согласен, что он должен возвращать reference-to-const, по умолчанию передавая ссылку на default-value в качестве второго аргумента, но я думаю, разработчики Qt чувствовали, что это слишком много магия.