LINUX.ORG.RU

Странное поведение итераторов в Qt


0

1

При компиляции этого кода выводится неправильный результат:

#include <QtCore/QList>
#include <QtCore/QtAlgorithms>
#include <QtCore/QtDebug>

int main()
{
    QList<int> vec;
    // vec.end(); // (1)
    qDebug() << (vec.end() != qFind(vec, 4));
    qDebug() << (qFind(vec, 4) != vec.end());
}
true
false

Если раскомментировать строку (1), сделать контейнер непустым или использовать QVector, выводится правильный результат. При использовании второго варианта qFind(vec.begin(), vec.end,...) программа работает правильно.

Это я что-то делаю неправильно, ошибка в Qt или документированное неопределенное поведение?

Ответ на: комментарий от summatus

>Except for isEmpty(), member functions always assume the list is not empty.

Теперь нашел. Очень странное требование, везде проверять isEmpty.

zombiegrinder_6000
() автор топика

Так должно работать:

#include <QtCore/QList>
#include <QtCore/QtAlgorithms>
#include <QtCore/QtDebug>

int main()
{
    QList<int> vec;
    // vec.end(); // (1)
    qDebug() << (vec.constEnd() != qFind(vec, 4));
    qDebug() << (qFind(vec, 4) != vec.constEnd());
}

qFind(vec, 4) равносильно: qFind(vec.constBegin(), vec.constEnd(), 4) и похоже vec.end() и vec.constEnd() несовместимые итераторы.

PS: позже в исходниках покопаюсь, более конкретный ответ смогу дать.

Devix
()
Ответ на: комментарий от Devix

Несовместимые!! Блин когда-то много мата на этих граблях схватил

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