【问题标题】:Wunused-but-set-variable warning with C++11 autoWunused-but-set-variable 警告与 C++11 自动
【发布时间】:2012-02-03 21:31:45
【问题描述】:

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

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

【问题讨论】:

  • “如果i 是元素的副本,则警告将有意义”:您回答了自己的问题:i 元素的副本。

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


【解决方案1】:

我认为问题在于你的 for 循环,写成这样:

for ( auto i : f.vertexIndices ) 

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

如果你改成

for ( auto& i : f.vertexIndices ) 

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

希望这会有所帮助!

【讨论】:

  • 我是个傻瓜。我一直认为 auto 在这种情况下将代表一个迭代器,但它当然是取消引用它并给我一个元素的副本。谢谢!我有很多重新打字要做...
  • @cbamber85 :这意味着您认为某个迭代器有一个名为 normal 的数据成员,因为您显示的代码有多次 i.normal = ...;...
  • 我说我是个傻瓜不是吗?
  • @cbamber85 :很公平。 :-P
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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;
                }
        }
    
    • 由维基百科提供

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多