2016-07-12 11 views
0

私は各[Modern C++スタイル]にaを使用しようとしていましたが、コードは毎回クラッシュしました!後で私の驚きのうち、私は内部のデータがあるのに形式で返さQStringListが無効であるか、完全に独立したオブジェクトのいずれかであることを発見しメンバfunc形式()の各呼び出しで、QMimeDataが無効なQStringListを返すのはなぜですか?

for(auto &k:mimeData->formats()) 
{ ... } 

同じであるべき: それはのようなものでした!私は内部的に何が起こっているかを決めるカント右辺値参照を取るまで、またはしない限り、

false 
false 
true 
OMG! is it empty? -> true 

: は、だから私はもっと簡単な例では把握することを試みた:

#include <iostream> 
#include <string> 
#include <list> 

#include <QCoreApplication> 
#include <QMimeData> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    cout<<boolalpha; 

    list<string> ls; 
    cout<<(ls.begin() != ls.end())<<"\n"; 

    QStringList qsl; 
    cout<<(qsl.begin() != qsl.end())<<"\n"; 

    QMimeData qme; 

    cout<<(qme.formats().begin() != qme.formats().end())<<"\n"; 
    cout<<"OMG! is it empty? -> "<<qme.formats().empty()<<"\n"; 

    return a.exec(); 
} 

出力のようなものです!

Qtのforeachではなく、ループベースの範囲で使用するソリューションが本当に必要です!

P.S.私はO(n)を避けるためにそれをコピーしたくない。

答えて

1

ドキュメントを見ると、QMimeDataクラスでサポートされているフォーマットのQStringListがフィールドとして保持されているとは限りません。

ソースコードは(Qt5.4/srcに/ qtbase/SRC/Corelibでは/カーネル/ qmimedata.cpp:593):ことをサポートしていますので、このリストはformats()にすべてのコール上に構築されて

QStringList QMimeData::formats() const 
{ 
    Q_D(const QMimeData); 
    QStringList list; 
    for (int i=0; i<d->dataList.size(); i++) 
     list += d->dataList.at(i).format; 
    return list; 
} 

。それを遠くに呼び出すと、常に別のコンテナが生成されます。

トラバースするために保存する必要があるため、ローカルコピーを保存することをおすすめします。 C++ 11では、それを構築することができます(実際はoptimized even better)。

+0

オブジェクトを左辺値参照として保持してもオブジェクトは存続しますか? LIKE: '{ 自動&& formatList = mimeData->フォーマット(); ... //ブロックの終わり } ' –

+1

@pPanda_beta - ローカル(破棄された)変数への参照を使用しているので、それは保証されていません。 RVOを使用する通常の変数に割り当てると、オブジェクトは呼び出しの代わりに作成されます(このように考える)。 – hauron

関連する問題