Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Как избежать warning-а в range based for loop?

#gcc #cpp


Начал экспериментировать с новым стандартом C++ и столкнулся с проблемой.
У меня есть класс, который предоставляет числовой диапазон, по которому
можно итерироваться. Он позволяет цикл вида
for (int i = 0; i < N; ++i) {
    std::cout << i << std::endl;
}

заменить на
for (int i: range(N)) {
    std::cout << i << std::endl;
}

Этот код прекрасно работает, но если мы хотим просто повторить действие несколько раз:
for (int i: range(N)) {
    doSomething();
}

то компилятор (g++-4.6) выдает предупреждение 

warning: unused variable ‘i’ [-Wunused-variable]

при этом классический цикл for (int i = 0; i < N; ++i) компилируется прекрасно.
У меня возник вопрос - это нормальное поведение или это баг g++?
Ведь фактически переменная i используется.
Можно ли как-нибудь отключить это предупреждение?
-Wno-unused-variable не предлагать.
UPD:
Почитал стандарт, там написано:
The range-based for statement
for ( for-range-declaration : expression ) statement

is equivalent to
{
    auto && __range = ( expression );
    for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin )
    {
        for-range-declaration = *__begin;
        statement
    }
}

так что действительно в моем случае переменная i - неиспользуемая.    


Ответы

Ответ 1



Это нормальное поведение, ведь, как вы верно заметили, переменная i не используется, а в классическом варианте переменная используется, ибо она инкрементируется.

Ответ 2



Использовать другой цикл. Этот вид цикла предназначен для прохода по коллекциям, а вы его используете немного не по назначению.

Ответ 3



если нужно, то как-то так: for (int i: range(N)) { #ifdef OMG doAnything(i); #else (void)i; doSomething(); #endif }

Комментариев нет:

Отправить комментарий