#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 }
Комментариев нет:
Отправить комментарий