2016-07-20 13 views
1

QVariantQStringListと比較すると奇妙な結果が出ています。QStringListを比較したQVariants

コード:

QStringList l1, l2; 

l1 << ""; 
l2 << "33" << "434"; 

const bool le = l1 < l2; 
const bool ge = l1 > l2; 
const bool eq = l1 == l2; 

QVariant v1(l1), v2(l2); 

const bool vle = v1 < v2; 
const bool vge = v1 > v2; 
const bool veq = v1 == v2; 

私はl1私の比較結果(legeeq)を修正値を期待しています。しかし、バリアントの結果にはまったく影響しません。私はいつもvge == true、vleveqは常にfalseです。

文書によれば、動作するはずです。私はどこか間違っているのですか、それともQtバグですか? 私はQt5.7を使用しています。

私はこの問題のためにバグレポートを埋めてきた

EDIT:https://bugreports.qt.io/browse/QTBUG-54893

+0

私は、あなたがQVariants間の賢明な比較を期待すべきではないと言うだろうが、どうにか私はそれがバグだと強く思っています、実装:cf:https://code.woboq.org/qt5/qtbase/src/corelib/kernel/qvariant.cpp.html#_ZNK8QVariant7compareERKS_ – peppe

答えて

2

ニース1。ここ

は、この動作を生成するQtのソースコードの正確な行である:https://github.com/qt/qtbase/blob/4e41babd0337473a1078d3a5f3367cc1fc5f2935/src/corelib/kernel/qvariant.cpp#L3564

QStringListための特別な場合、従ってQVariant ::のtoStringは(存在しない)が存在する場合は、空の文字列を返す、と呼ばれていますQStringList内に1つ以上の項目がない場合、または最初の項目が1つのみの場合は最初の項目になります。

2つの空の文字列を比較すると、0が返されます。2つのQVariantを1つのエントリと比較すると、両方の文字列が比較され、2つのQVariantを複数のエントリと比較すると、型が比較され、その結果、<は常にfalseおよび>が常にtrueに戻ります。

私にバグのように見えます。

例:

// expected behaviour when both have a single entry 
QStringList l, m; 
l << "0"; 
m << "1"; 
QVariant less(l); 
QVariant more(m); 
less < more; // true 
less > more; // false 

QStringList l, m; 
l << "1"; 
m << "0"; 
QVariant less(l); 
QVariant more(m); 
less < more; // false 
less > more; // true 

// ... or both have no entry 
QStringList l, m; 
QVariant less(l); 
QVariant more(m); 
less < more; // false 
more < less; // false 
more == less; // true 

// otherwise, things get weird 
QStringList l, m; 
l << "0" << "1"; 
m << "2" << "3"; 
QVariant less(l); 
QVariant more(m); 
less < more; // false 
more < less; // false 
less > more; // true 
more > less; // true 
less == more; // false 

QStringList l, m; 
m << "2" << "3"; 
QVariant less(l); 
QVariant more(m); 
less < more; // false 
more < less; // false 
less > more; // true 
more > less; // true 
less == more; // false 

など


編集:明示的QVariantsでQStringListsを比較修正をプッシュ:https://codereview.qt-project.org/#/c/165886/1