Wunused-но-набор-переменная предупреждение с C ++ 11 авто - PullRequest
1 голос
/ 04 февраля 2012

Я получаю предупреждение -Wunused-but-set-variable с GCC v4.6 с кодом ниже:

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, поэтому пока ничего не компилируется. Но я надеялся, что кто-нибудь скажет мне, является ли это предупреждение бессмысленным, или я неправильно понял auto и range-based for loop ...

Ответы [ 3 ]

7 голосов
/ 04 февраля 2012

Я думаю, что проблема в том, что ваш цикл for, как написано так:

for ( auto i : f.vertexIndices ) 

возвращает копию сохраненной вершины, а не ссылку на нее.Здесь предупреждение компилятора говорит, что вы устанавливаете значение i, но не читаете его, потому что вы изменяете временную копию, а не сохраненную вершину.

Если вы измените ее на

for ( auto& i : f.vertexIndices ) 

тогда эта проблема должна исчезнуть, поскольку вы на самом деле изменяете вершины, хранящиеся внутри.

Надеюсь, это поможет!

0 голосов
/ 04 февраля 2012

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;
            }
    }
  • Предоставлено Wikipedia
0 голосов
/ 04 февраля 2012

Вы неправильно поняли auto. Этот цикл:
for ( auto i : f.vertexIndices )
действительно должно быть:
for ( auto & i : f.vertexIndices )

...