Qt的foreach表达式需要深层复制吗?

ada*_*ker 4 c++ foreach qt

我对Qt的foreach函数有点问题.我有一个类Phrase,它是QList的子类.在〜Phrase中,我删除所有GlossItem指针.

在迭代Phrase中的GlossItem指针时,我想使用Qt的foreach:

    // phrase is a pointer to a Phrase object, 
    // which is a subclassed QList<GlossItem*>
    foreach( GlossItem *glossItem , *phrase )
    {
        // use glossItem
    }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,foreach正在对Phrase执行深层复制(我知道这是因为它需要我实现复制构造函数).但如果有一个短语的副本 - 如果我不想创建每个GlossItem的深层副本 - 这意味着这些指针将被删除两次.(或者,删除一次,然后崩溃.)所以我必须使用它,这可行,但不太漂亮.

    for(int i=0; i<phrase->count(); i++ )
    {
        GlossItem *glossItem = phrase->at(i);
        // use glossItem
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题,还是只需要忍受它?

Nic*_*ith 6

来自文档

Qt在进入foreach循环时自动获取容器的副本.

由于foreach创建了容器的副本,因此对变量使用非const引用不允许您修改原始容器.

因此,我认为对于您的特定用例foreach并不合适,否则您最终会获得Phrase带有附加指针的新副本,而不是返回Phrase您想要的实际原件.