LINUX.ORG.RU

Поведение QJsonObject::value() и QJsonObject::operator[]

 ,


0

1

Документация на класс QJsonObject гласит, что разницы между методами нет:

QJsonValue QJsonObject::operator[](const QString & key) const
Returns a QJsonValue representing the value for the key key.
This does the same as value().
The returned QJsonValue is QJsonValue::Undefined if the key does not exist.

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

QJsonObject test; test["entry"] = 42;

qDebug() << "Exists key:";
qDebug() << " - undef?  " << test["entry"].isUndefined();
qDebug() << " - null?   " << test["entry"].isNull();
qDebug() << " - vundef? " << test.value("entry").isUndefined();
qDebug() << " - vnull?  " << test.value("entry").isNull();

qDebug() << "Non exists key (operatopr[] first):";
qDebug() << " - undef?  " << test["entry_1"].isUndefined();
qDebug() << " - null?   " << test["entry_1"].isNull();
qDebug() << " - vundef? " << test.value("entry_1").isUndefined();
qDebug() << " - vnull?  " << test.value("entry_1").isNull();

qDebug() << "Non exists key (value() first):";
qDebug() << " - vundef? " << test.value("entry_2").isUndefined();
qDebug() << " - vnull?  " << test.value("entry_2").isNull();
// Here undefined key will be created with a null value
qDebug() << " - undef?  " << test["entry_2"].isUndefined();
qDebug() << " - null?   " << test["entry_2"].isNull();
qDebug() << " - vundef? " << test.value("entry_2").isUndefined();
qDebug() << " - vnull?  " << test.value("entry_2").isNull();
Exists key:
 - undef?   false
 - null?    false
 - vundef?  false
 - vnull?   false
Non exists key (operatopr[] first):
 - undef?   false
 - null?    true
 - vundef?  false
 - vnull?   true
Non exists key (value() first):
 - vundef?  true
 - vnull?   false
 - undef?   false
 - null?    true
 - vundef?  false
 - vnull?   true

До обращения к несуществующему ключу через оператор [] он действительно считается неопределенным (undefined) и при этом не является нулевым (null), после такого обращения он уже считается определенным и его значение null. При этом в документации указано, что обращение по value() и [] равнозначны и должны возвращать undefined, если ключа нет.

Воспроизводится ли этот баг у вас? Версия Qt 5.5.


Очевидно же, что для неконстантного объекта вызывается неконстантный operator[], который при отстуствии элемента добавляет его. Проверь то же самое на QJsonObject const test, все будет так, как ты ожидаешь.

UPD То есть между operator[]() const и value() const разницы действительно нет, но ты вызываешь operator[](), в документации к которому ничего такого не обещается.

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 2)
Ответ на: комментарий от staseg

Спасибо за объяснение. Невнимательно посмотрел документацию (на 10 строчек ниже всё объясняется). И в исходниках тоже всё хорошо видно.

leonid
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.