for 循环计数器给出未使用变量警告

for-loop counter gives an unused-variable warning

我的程序有一个带有 for 循环的迭代算法,我将其编写为

for ( auto i: std::views::iota( 0u, max_iter ) ) { ... }

我真的很喜欢它可以这样写,即使必要的头文件是巨大的。当我编译它时,我收到一条警告,指出 i 是一个未使用的变量。

当我用老式的方式写for循环时

for ( unsigned i=0; i < max_iter; i++ ) { ... }

那就没有警告了。

我用一个最小的程序测试了这个 for-loop.cpp:

#include<ranges>
#include<numeric>
#include<iostream>

int main() {

    char str[13] = "this is good";

    for (auto i : std::views::iota(0u, 2u)) {
        std::cout << str << "\n";
    }
  
    for (unsigned it=0; it<2; it++ ) {
        std::cout << str << "\n";
    }

    return 0; 
} 

果然,用 g++ -Wall --std=c++20 -o for-loop for-loop.cpp 编译它会在第一个循环而不是第二个循环中给出警告。

我是不是漏掉了什么?我更喜欢第一种表示法——而且我知道我可以用 -Wno-unused-variables 停止警告;我想要那些警告,只是我真的在使用 for 循环计数器。

使用 auto i 你永远不会在任何地方使用变量。

for ( unsigned i=0; i < max_iter; i++ ) 中,您使用了 i 两次,一次在 i < max_iter 中,一次在 i++ 中,因此使用了变量

i确实从未使用过。

您可以添加属性 [[maybe_unused]] (C++17) 以忽略该警告:

for ([[maybe_unused]]auto i : std::views::iota(0u, 2u)) {
    std::cout << str << "\n";
}