c++ - 使用 C++11 auto 的 Wunused-but-set-variable 警告

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

我在 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 是一个元素的拷贝,警告是有意义的,但是由于 vertexIndices 是一个 QList 对象(一个符合 STL 的Qt 容器类)基于范围的 for 循环应该调用 begin() 和 end() 迭代器 getter,这将始终返回一个非常量迭代器(只要容器是非常量 - 它就是)。

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

最佳答案

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

for ( auto i : f.vertexIndices ) 

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

如果你把它改成

for ( auto& i : f.vertexIndices ) 

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

希望这对您有所帮助!

关于c++ - 使用 C++11 auto 的 Wunused-but-set-variable 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9135775/

相关文章:

c++ - 如何使用 CLion 创建 C 项目

面对大项目的C++书籍推荐

c++ - 如何在 C++ 中验证数字输入

r - dplyr 版本的数据框分组然后在每组上创建回归模型

javascript - 从字符串数组中删除相邻的双字母

c++ - 类与结构与enable_shared_from_this

c++ - new 的内存是否必须来自 operator new?

c++字符串复制错误到结构指针数据字段

JavaScript for .. in 循环 IE 问题

c++ - 类型列表是否完全被可变参数模板取代?