QMap :: value возвращает ссылку на временный - PullRequest
0 голосов
/ 10 января 2019

Я хотел бы вернуть константную ссылку на значение QMap. Из того, что я могу понять, QMap отличается тем, что если вы попытаетесь получить доступ к ключу, который не существует, он создаст значение с помощью конструктора по умолчанию и вернет его. Но если я все еще правильно понимаю, ссылка будет временной, и поэтому я получаю предупреждение.

У меня есть этот кусок кода:

const T &getSelectionDesc(QListWidgetItem *item)
{
    if (!indexes.contains(item))
        indexes.insert(item, T(item->text()));
    return indexes.value(item);
}

Как видите, я уже убедился, что ключ что-то возвращает, я создаю объект в первый раз, когда он требуется, и затем сохраняю его в QMap для последующего использования.

Несмотря на это, я все еще получаю предупреждение, что я должен изменить здесь, чтобы исправить поведение?

Edit:

Вот как я определил indexes:

QMap<QListWidgetItem *, T> indexes;

Это предупреждение, которое я получаю:

В экземпляре 'const T & SelectListDialog :: getSelectionDesc (QListWidgetItem *) [with T = BackgroundDesc]':

предупреждение: возврат ссылки на временный [-Wreturn-local-addr]

return indexes.value (item);

1 Ответ

0 голосов
/ 10 января 2019

Согласно документации QMap::value():

const T QMap::value(const Key &key, const T &defaultValue = T()) const

Обратите внимание, что тип возвращаемого значения const T и не является ссылкой. Это означает, что return indexes.value(item) вернет копию значения из QMap и не назначит ссылку. Как только выход из области действия функции, скопированный объект уничтожается - это временный объект. Это объясняет «ссылку на временное» предупреждение, которое вы получаете.

В вашем конкретном случае используйте взамен оператор индекса . Неконстантная перегрузка возвращает ссылку на тип T. Из документов:

T &QMap::operator[](const Key &key)

Вы правильно заявили, что

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

Но так как вы уже проверяете, есть ли ключ item в вашем QMap, вы гарантируете, что ключ item существует. Таким образом, вы можете (должны) изменить свой оператор return на * 1036

return indexes[item];

Обратите внимание, что для const QMap с оператором нижнего индекса по умолчанию будет перегруженный оператор:

const T QMap::operator[](const Key &key) const

То же, что и значение ().

Это также возвращает копию значения вместо ссылки. Но поскольку ваша карта неконстантна, эта перегрузка не используется.

...