Search code examples
c++for-loopc++11compiler-warningsauto

Wunused-but-set-variable warning with C++11 auto


I am getting a -Wunused-but-set-variable warning with GCC v4.6 with the code below:

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 );
     }
}

The warning specifically is:

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

The warning would make sense if i was a copy of an element, but since vertexIndices is a QList object (an STL-compliant Qt container class) the range-based for loop should call the begin() and end() iterator getters, which will always return a non-const iterator (as long as the container is non-const - which it is).

I can't currently test if it is working as I think it should because I'm changing my code base to take advantage of the new C++11 features, so nothing compiles yet. But I was hoping someone could tell me if this warning is is nonsense, or if I have misunderstood auto and range-based for loops...


Solution

  • I think the issue is that your for loop, as written like this:

    for ( auto i : f.vertexIndices ) 
    

    is getting back a copy of the stored vertex, not a reference to it. The compiler warning here says that you're then setting the value of i but not reading it because you're modifying the temporary copy rather than the stored vertex.

    If you change it to

    for ( auto& i : f.vertexIndices ) 
    

    then this problem should go away, since you're actually modifying the vertices stored internally.

    Hope this helps!