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

cma*_*t85 1 c++ for-loop compiler-warnings auto c++11

我正在使用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 );
     }
}
Run Code Online (Sandbox Code Playgroud)

警告具体是:

warning: variable 'i' set but not used [-Wunused-but-set-variable]
Run Code Online (Sandbox Code Playgroud)

警告将使意义,如果i是一个元素的副本,但由于vertexIndices是一个QList对象(符合STL-QT容器类)的范围为基础的循环应该调用begin()和end()迭代器干将,这将始终返回一个非const迭代器(只要容器是非const的 - 就是它).

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

tem*_*def 7

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

for ( auto i : f.vertexIndices ) 
Run Code Online (Sandbox Code Playgroud)

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

如果你改成它

for ( auto& i : f.vertexIndices ) 
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!