将右值引用传递给 QVariant 不适用于 QString
Passing rvalue reference to QVariant does not work with QString
我正在尝试 return 从函数到 QVariant 的右值引用。
它适用于 bool 和 int,但是当我传递一个字符串时,我得到一个 'invalid' 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();
}
有人知道为什么吗?
如评论中所述,您 return 是一个悬空引用。所以你有未定义的行为,任何事情都可能发生。
在可行的情况下,QVariant 包含一个整数。我的猜测是你很幸运,保存 int 的内存没有被重写(或释放)。
对于QString,你的运气用完了,实际内容并没有存储在QString对象中,而是存储在堆上,一旦函数returned就被释放了。剩下的就是 empty/null QString
.
解决方案:return QVariant 值。
我正在尝试 return 从函数到 QVariant 的右值引用。 它适用于 bool 和 int,但是当我传递一个字符串时,我得到一个 'invalid' 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();
}
有人知道为什么吗?
如评论中所述,您 return 是一个悬空引用。所以你有未定义的行为,任何事情都可能发生。
在可行的情况下,QVariant 包含一个整数。我的猜测是你很幸运,保存 int 的内存没有被重写(或释放)。
对于QString,你的运气用完了,实际内容并没有存储在QString对象中,而是存储在堆上,一旦函数returned就被释放了。剩下的就是 empty/null QString
.
解决方案:return QVariant 值。