使用C ++ 11 auto进行Wunused-set-variable警告

时间:2012-02-03 21:31:46

标签: c++ for-loop c++11 compiler-warnings auto

我正在使用GCC v4.6获得一个-Wunused-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容器类),因此基于范围的loop应该调用begin()和end()迭代器getter,它总是会返回一个非const迭代器(只要容器是非const的 - 就是它)。

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

3 个答案:

答案 0 :(得分:7)

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

for ( auto i : f.vertexIndices ) 

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

如果您将其更改为

for ( auto& i : f.vertexIndices ) 

然后这个问题应该消失,因为你实际上正在修改内部存储的顶点。

希望这有帮助!

答案 1 :(得分:0)

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

答案 2 :(得分: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;
            }
    }
  • 由维基百科提供