c++ auto“t{1U}”在下面std::make_heap示例中基于范围的for循环中做什么?

xfb7svmp  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(115)

我在浏览标准算法库时,偶然发现了一个例子,它以一种我以前从未见过的方式使用了基于范围的for循环:https://en.cppreference.com/w/cpp/algorithm/is_heap
在给出的例子中,他们使用了一个基于范围的for循环来迭代整数向量:

for (auto t{1U}; auto i : v)
    std::cout << i << (std::has_single_bit(++t) ? " | " : " ");

我熟悉最常用的基于范围的for循环。例如

for (const auto& elem : vector)
{
    // do something with elem
}

然而,我很困惑地看到auto t{1U},我从来没有见过,我想知道它做了什么?
它看起来像是一个临时的范围表达式:https://en.cppreference.com/w/cpp/language/range-for但是我仍然不明白t到底是什么,为什么这里需要它?

8zzbczxx

8zzbczxx1#

如果查看您自己链接到的基于范围的引用,您将看到语法包含一个名为 init-statement (optional) 的子句。
auto t{1U};是可选初始化语句。
它只是一种在循环范围内定义一个或多个变量的方法。
所以呢

for (auto t{1U}; auto i : v)
    std::cout << i << (std::has_single_bit(++t) ? " | " : " ");

基本上等同于

{
    auto t{1U};  // The same as unsigned t = 1;

    for (auto i : v)
        std::cout << i << (std::has_single_bit(++t) ? " | " : " ");
}

值得注意的是,the if statement自C++17标准以来就有这样一个 init-statement

相关问题