Передача rvalue ссылки на QVariant не работает с QString

Я пытаюсь вернуть ссылку на rvalue из функции в QVariant. Это работает для bool и int, но когда я передаю строку, я получаю недопустимый QVariant.

Моя функция:

QVariant &&AudioSettings::getValueFromTable(const QString &name)
{
    QSqlQuery query(_messengerDB);
    auto queryStr = QString("SELECT %1 FROM user_audio WHERE id = 1;").arg(name);
    if(query.exec(queryStr)){

        if(query.next()){
            qDebug() << "AudioSettings::getValueFromTable" << query.value(0);  //here I have a correct QString value => QVariant(QString, "Głośniki (USB Audio CODEC )")
            return std::move(query.value(0));

        } else {
            qDebug() << "AudioSettings::setValueToTable : No data for '" << queryStr << "'";
            return QVariant();
        }

    } else {
        qDebug()<<"AudioSettings::setValueToTable : Error during getting " << name << " form table user_audio.";
        qDebug() << query.lastQuery();
        qDebug() << query.lastError();
    }
    return QVariant();
}

когда я звоню:

QString &&AudioSettings::getAudioOut()
{
    auto value = getValueFromTable("audio_out");  //here I get an invalid QVariant
    return value.isNull() ? QString() : value.toString(); 
}

Что работает это:

int AudioSettings::getRingtoneType()  //EDIT
{
    auto value = getValueFromTable("ringtone_type");  //EDIT, I am getting a QVariant with an int inside
    return value.isNull() ? 0 : value.toInt();
}

Кто-нибудь знает почему?

1 ответ

Решение

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

В случае, если это работает, QVariant содержит целое число. Я предполагаю, что вам просто повезло, что память, содержащая int, не была переписана (или освобождена).

Для QString ваша удача заканчивается, фактический контент не сохраняется в объекте QString, но он сохраняется в куче и освобождается после возврата функции. Все, что осталось, это пустой / ноль QString,

Решение: вернуть QVariant по значению.

Другие вопросы по тегам