我正在使用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
是元素的副本,则警告是有意义的,但由于vertexIndices
是QList
对象(符合STL的Qt容器类),因此基于范围的loop应该调用begin()和end()迭代器getter,它总是会返回一个非const迭代器(只要容器是非const的 - 就是它)。
我目前无法测试它是否正常工作,因为我正在改变我的代码库以利用新的C ++ 11功能,所以没有编译。但是我希望有人可以告诉我这个警告是否是无意义的,或者我是否误解了自动和基于范围的循环...
答案 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;
}
}