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