4

QStringListのコピーに応じて、次のコードが異なる結果を生成する理由を誰かに説明してもらえますか:

    #include <stdio.h>
    #include <QStringList>

    bool qtTest(bool b)
    {
        QStringList list;
        list.push_back("0");
        list.push_back("1");
        list.push_back("2");

        QStringList::const_iterator it = list.end();

        if (b) {
            // 'static' to prevent optimization
            static QStringList copy = list;
        }

        --it; // 2
        --it; // 1
        --it; // 0
        ++it; // 1
        ++it; // 2
        --it; // 1
        ++it; // 2
        ++it; // end

        return it == list.end();
    }

    int main(int, char *[])
    {
        printf("equality with copy: %d", qtTest(true));
        printf("equality without copy: %d", qtTest(false));

        return 0;
    }

出力:

equality with copy: 0
equality without copy: 1

ただし、 std::vector はコピーに関係なく同等の出力を提供します。

Debian 7 x86 GCC x86 32 ビット Qt 5.1.0 デバッグ qmake 仕様 linux-g++

回答ありがとうございます

4

2 に答える 2

3
QStringList::const_iterator it = list.end();

この呼び出しには十分注意してください。(おそらく望ましくない) デタッチが発生します。必要ない場合は constEnd() を使用してください。そして、さらなる質問を防ぐために、ドキュメントを引用させてください:

暗黙的な共有は、STL スタイルの反復子に別の影響を及ぼします。非定数反復子がそのコンテナーでアクティブになっている間は、コンテナーのコピーを取得してはなりません。Java スタイルの反復子は、その制限に悩まされることはありません。

于 2013-07-25T07:43:26.823 に答える