1

我收到了 GCC v4.6 的 -Wunused-but-set-variable 警告,代码如下:

for ( auto i : f.vertexIndices ) {
    Sy_MatrixFuzzyHashable< Vector3f > wrapper( cp );
    if ( !vMapper.contains( wrapper ) ) {
        mesh.vertexNormals() << cp;
        i.normal = mesh.vertexNormals().size() - 1;
     } else {
        i.normal = vMapper.value( wrapper );
     }
}

警告具体是:

warning: variable 'i' set but not used [-Wunused-but-set-variable]

i如果是元素的副本,则警告将有意义,但由于vertexIndicesQList对象(符合 STL 的 Qt 容器类),基于范围的 for 循环应调用 begin() 和 end() 迭代器 getter,它将始终返回一个非常量迭代器(只要容器是非常量的 - 它就是)。

我目前无法测试它是否按我认为的那样工作,因为我正在更改我的代码库以利用新的 C++11 功能,所以还没有编译。但我希望有人能告诉我这个警告是否是无稽之谈,或者我是否误解了自动和基于范围的 for 循环......

4

3 回答 3

7

我认为问题在于您的 for 循环,如下所示:

for ( auto i : f.vertexIndices ) 

正在取回存储顶点的副本,而不是对其的引用。此处的编译器警告说您正在设置值i但不读取它,因为您正在修改临时副本而不是存储的顶点。

如果您将其更改为

for ( auto& i : f.vertexIndices ) 

那么这个问题应该会消失,因为您实际上是在修改内部存储的顶点。

希望这可以帮助!

于 2012-02-03T21:33:43.083 回答
0

你误会了auto。这个循环:
for ( auto i : f.vertexIndices )
真的应该是:
for ( auto & i : f.vertexIndices )

于 2012-02-03T21:35:13.283 回答
0

http://en.wikipedia.org/wiki/Foreach_loop#C.2B.2B

说明了一个示例,但是是的,它需要是 foreach 的参考对象

    #include <iostream>
    int main()
    {
      int myint[] = {1,2,3,4,5};

      for (int& i: myint)
      {
        std::cout << i << std::endl;
      }
    }

或者

    #include <QList>
    #include <QDebug>

    int main() {
            QList<int> list;
            list << 1 << 2 << 3 << 4 << 5;
            foreach (int i, list) {
                    qDebug() << i;
            }
    }
  • 由维基百科提供
于 2012-02-03T21:39:58.117 回答